home *** CD-ROM | disk | FTP | other *** search
/ OctaMED Sound Studio 1 / OctaMED SoundStudio V1.iso / soundstudio v1 / programmers / med-mixasm.a < prev    next >
Text File  |  1996-06-18  |  122KB  |  5,517 lines

  1. ; ***********************************************************
  2. ; ****              OctaMED Pro source code              ****
  3. ; ****             Written by Teijo Kinnunen             ****
  4. ; **** Copyright 1995-1996 Teijo Kinnunen & RBF Software ****
  5. ; ****                All rights reserved.               ****
  6. ; ****                  Mixing routines                  ****
  7. ; ***********************************************************
  8.  
  9. ; This file is used as such both by OctaMED and the external
  10. ; player routines. These flags specify the correct mode.
  11.  
  12. ; This must be 0 always (except when compiling OctaMED)
  13. OCTAMED_INTERN    EQU    0
  14.  
  15. ; Set either or both to 1
  16. SUPPORT_000    EQU    1
  17. SUPPORT_020    EQU    1
  18.  
  19. ; Set to 1 if you need smoothing (usually you won't...I suppose)
  20. SUPPORT_SMOOTH    EQU    0
  21.  
  22.         MC68020
  23.         MC68881
  24.     IFEQ    OCTAMED_INTERN
  25.         OUTPUT    med-mixasm.o
  26.     ELSEIF
  27.         OUTPUT    obj/med-mixasm.o
  28.     ENDC
  29.         LINKOBJ
  30.         INCLUDE    "medtrkdata.i"
  31.     IFEQ    OCTAMED_INTERN
  32.         INCLUDE    "chinfo.i"
  33.     ENDC
  34.         BOPT    O+,wo-
  35.  
  36.         XREF    _buffsize
  37.         XREF    _chinfo
  38.  
  39. ; -------------------------------------------------------------------
  40. ; These register variables are used by all mixing routines.
  41. ; -------------------------------------------------------------------
  42. ;    D2 = ci_offset
  43. ;    D4 = ci_fraction
  44. ;    D5 = ci_advance
  45. ;    D6 = ci_advfract
  46.  
  47.  
  48.     IFNE    OCTAMED_INTERN
  49.         XREF    _UtilityBase
  50.     ELSEIF
  51.         XREF    UtBase
  52.     ENDC
  53.  
  54.     IFNE    SUPPORT_000
  55. ; -------------------------------------------------------------------
  56. ; MixSample(WORD *dest,UWORD mixlen) (a1,d2)
  57. ; -------------------------------------------------------------------
  58. ; Note: mixlen may not be > 32767!!
  59.  
  60. MixSample
  61.         movem.l    d2-d7/a2-a6,-(sp) ;note: (sp).l = mixlen
  62. ; --- Track loop:
  63.         move.w    m_channels(pc),d7
  64.         movea.l    _chinfo,a5
  65.         subq.w    #1,d7
  66. msm_chloop    tst.b    ci_flags(a5)    ;CHFLAG_MUTED?
  67.         bmi.w    msm_chloopend
  68.         moveq    #0,d3    ;the upper word used by some mix routines
  69.         move.w    2(sp),d3    ;d3 = mixlen
  70. ; --- load registers for mixing
  71.         movem.l    ci_mixregs(a5),d2/d4/d5/d6/a4
  72.         movea.l    a1,a2        ;destination pointer
  73.         btst    #CHFLAGB_BACKW,ci_flags(a5) ;backwards?
  74.         bne.w    msm_backwards
  75. msm_loop2    ;while(left_to_mix > 0)...
  76.         move.l    d5,d1    ;d1 = advance
  77. ; Tests whether current sample end is reached within remaining
  78. ; space in mixing buffer.
  79.         move.w    d3,d0
  80.         mulu    d6,d0    ;advfract * size...
  81.         add.l    d4,d0    ;... + fraction
  82.         clr.w    d0
  83.         swap    d0
  84.         mulu    d3,d1    ;advance * size
  85.         add.l    d0,d1
  86.         move.l    ci_endoffset(a5),d0
  87.         sub.l    d2,d0    ;d0 = endoffset - offset
  88.         ble.s    msm_mutechan    ;loop too short
  89.         cmp.l    d0,d1
  90.         bhs.s    msm_calcsize
  91. ; Sample end won't be reached... just fill the remaining mix buffer
  92. ; size straight away.
  93.         move.w    d3,d0
  94.         jsr    (a4)
  95.         cmp.l    ci_endoffset(a5),d2
  96.         blo.s    msm_savereg
  97.         moveq    #0,d3
  98.         bra.s    msm_sampleend
  99. ; Sample end will be reached: calculate how many bytes can be mixed.
  100. ; (This calculation requires that remaining buffer size fits in a word.)
  101. msm_calcsize    swap    d0    ;d0 already contains endoffs - offs
  102.         clr.w    d0    ;<< 16
  103.         sub.l    d4,d0    ; - fraction
  104.         subq.l    #1,d0    ; - 1
  105.         move.w    d5,d1    ;advance..
  106.         swap    d1
  107.         move.w    d6,d1    ;advfract.
  108. ; 32-bit division required... utility.library used for 68000
  109. ; compatibility
  110.     IFNE    OCTAMED_INTERN
  111.         movea.l    _UtilityBase,a0
  112.     ELSEIF
  113.         movea.l    UtBase,a0
  114.     ENDC
  115.         jsr    -$9C(a0)    ;UDivMod32()
  116.         addq.w    #1,d0
  117.         sub.w    d0,d3        ;left_to_mix -= passsize
  118.         jsr    (a4)        ;mix/skip
  119.         cmp.l    ci_endoffset(a5),d2
  120.         bhs.s    msm_sampleend
  121.         tst.w    d3
  122.         beq.s    msm_savereg
  123. msm_sampleend    btst    #CHFLAGB_LOOP,ci_flags(a5)
  124.         beq.s    msm_mutechan
  125.         btst    #CHFLAGB_PINGPONG,ci_flags(a5)
  126.         bne.s    msm_pingpong
  127.         sub.l    ci_restartoffset(a5),d2
  128.         move.l    ci_newstart_addr(a5),d0
  129.         beq.s    msm_loopend
  130.         move.l    d0,ci_sample_start(a5)
  131.         move.l    ci_newendoffset(a5),d0
  132.         move.l    d0,ci_endoffset(a5)
  133.         move.l    d0,ci_restartoffset(a5)
  134. msm_loopend    tst.w    d3    ;left_to_mix
  135.         bgt.s    msm_loop2
  136.         bra.s    msm_savereg
  137. msm_mutechan    bset    #CHFLAGB_MUTED,ci_flags(a5)
  138. ; --- save registers after mixing
  139. msm_savereg
  140.         movem.l    d2/d4,ci_mixregs(a5)
  141. msm_chloopend    adda.w    #ci_sizeof,a5
  142.         dbra    d7,msm_chloop
  143.         movem.l    (sp)+,d2-d7/a2-a6
  144.         rts
  145.  
  146. ; swap mixing routine (change direction)
  147. msm_pingpong    move.l    ci_altmixroutine(a5),d0
  148.         move.l    a4,ci_altmixroutine(a5)
  149.         movea.l    d0,a4
  150.         move.l    d0,ci_mixroutine(a5)
  151.         bchg    #CHFLAGB_BACKW,ci_flags(a5)
  152. ; loop beginning -> loop end
  153.         move.l    ci_endoffset(a5),d0
  154. ; turn pointer to the other side of the previous end offset
  155.         sub.l    d0,d2
  156.         neg.l    d2
  157.         add.l    d0,d2
  158.         sub.l    ci_restartoffset(a5),d0
  159.         move.l    d0,ci_endoffset(a5)
  160.         tst.w    d3
  161.         beq.s    msm_savereg
  162. msm_backwards    
  163. msmb_loop2    ;while(left_to_mix > 0)...
  164.         move.l    d5,d1    ;d1 = advance
  165. ; Tests whether current sample end is reached within remaining
  166. ; space in mixing buffer.
  167.         move.w    d3,d0
  168.         mulu    d6,d0    ;advfract * size...
  169.         add.l    d4,d0    ;... + fraction
  170.         clr.w    d0
  171.         swap    d0
  172.         mulu    d3,d1    ;advance * size
  173.         add.l    d0,d1
  174.         move.l    d2,d0
  175.         sub.l    ci_endoffset(a5),d0    ;d0 = offset - endoffset
  176.         ble.s    msm_mutechan    ;loop too short
  177.         cmp.l    d0,d1
  178.         bhs.s    msmb_calcsize
  179. ; Sample end won't be reached... just fill the remaining mix buffer
  180. ; size straight away.
  181.         move.w    d3,d0
  182.         jsr    (a4)
  183.         cmp.l    ci_endoffset(a5),d2
  184.         bgt.s    msm_savereg
  185.         moveq    #0,d3
  186.         bra.s    msmb_sampleend
  187. ; Sample end will be reached: calculate how many bytes can be mixed.
  188. ; (This calculation requires that remaining buffer size fits in a word.)
  189. msmb_calcsize    swap    d0    ;d0 already contains endoffs - offs
  190.         clr.w    d0    ;<< 16
  191.         sub.l    d4,d0    ; - fraction
  192.         subq.l    #1,d0    ; - 1
  193.         move.w    d5,d1    ;advance..
  194.         swap    d1
  195.         move.w    d6,d1    ;advfract.
  196. ; 32-bit division required... utility.library used for 68000
  197. ; compatibility
  198.     IFNE    OCTAMED_INTERN
  199.         movea.l    _UtilityBase,a0
  200.     ELSEIF
  201.         movea.l    UtBase,a0
  202.     ENDC
  203.         jsr    -$9C(a0)    ;UDivMod32()
  204.         addq.w    #1,d0
  205.         sub.w    d0,d3        ;left_to_mix -= passsize
  206.         jsr    (a4)        ;mix/skip
  207.         cmp.l    ci_endoffset(a5),d2
  208.         ble.s    msmb_sampleend
  209.         tst.w    d3
  210.         beq.s    msm_savereg
  211. msmb_sampleend    btst    #CHFLAGB_LOOP,ci_flags(a5)
  212.         beq.s    msm_mutechan
  213.         btst    #CHFLAGB_PINGPONG,ci_flags(a5)
  214.         bne.s    msm_pingpong2
  215.         add.l    ci_restartoffset(a5),d2
  216.         tst.w    d3    ;left_to_mix
  217.         bgt.s    msmb_loop2
  218.         bra.s    msm_savereg
  219.  
  220. ; swap mixing routine (change direction)
  221. msm_pingpong2    move.l    ci_altmixroutine(a5),d0
  222.         move.l    a4,ci_altmixroutine(a5)
  223.         movea.l    d0,a4
  224.         move.l    d0,ci_mixroutine(a5)
  225.         bchg    #CHFLAGB_BACKW,ci_flags(a5)
  226. ; loop beginning -> loop end
  227.         move.l    ci_endoffset(a5),d0
  228. ; turn pointer to the other side of the previous end offset
  229.         sub.l    d0,d2
  230.         neg.l    d2
  231.         add.l    d0,d2
  232.         add.l    ci_restartoffset(a5),d0
  233.         move.l    d0,ci_endoffset(a5)
  234.         tst.w    d3
  235.         bgt.s    msm_loop2
  236.         bra.s    msm_savereg
  237.     ENDC
  238.  
  239.     IFNE    SUPPORT_020
  240. ; -------------------------------------------------------------------
  241. ; MixSample_020(WORD *dest,UWORD mixlen) (a1,d2)
  242. ; -------------------------------------------------------------------
  243.  
  244. MixSample_020    movem.l    d2-d7/a2-a6,-(sp) ;note: (sp).l = mixlen
  245. ; --- Track loop:
  246.         move.w    m_channels(pc),d7
  247.         movea.l    _chinfo,a5
  248.         subq.w    #1,d7
  249. msm2_chloop    tst.b    ci_flags(a5)    ;CHFLAG_MUTED?
  250.         bmi.w    msm2_chloopend
  251.         moveq    #0,d3    ;the upper word used by some mix routines
  252.         move.w    2(sp),d3    ;d3 = mixlen
  253. ; --- load registers for mixing
  254.         movem.l    ci_mixregs(a5),d2/d4/d5/d6/a4
  255.         movea.l    a1,a2        ;destination pointer
  256.         btst    #CHFLAGB_BACKW,ci_flags(a5) ;backwards?
  257.         bne.w    msm2_backwards
  258. msm2_loop2    ;while(left_to_mix > 0)...
  259.         move.l    d5,d1    ;d1 = advance
  260. ; Tests whether current sample end is reached within remaining
  261. ; space in mixing buffer.
  262.         ext.l    d3
  263.         swap    d1
  264.         move.w    d6,d1
  265.         mulu.l    d3,d0:d1
  266.         add.l    d4,d1        ;add fraction
  267.         move.w    d0,d1
  268.         swap    d1
  269.         move.l    ci_endoffset(a5),d0
  270.         sub.l    d2,d0    ;d0 = endoffset - offset
  271.         ble.s    msm2_mutechan    ;loop too short
  272.         cmp.l    d0,d1
  273.         bhs.s    msm2_calcsize
  274. ; Sample end won't be reached... just fill the remaining mix buffer
  275. ; size straight away.
  276.         move.w    d3,d0
  277.         jsr    (a4)
  278.         cmp.l    ci_endoffset(a5),d2
  279.         blo.s    msm2_savereg
  280.         moveq    #0,d3
  281.         bra.s    msm2_sampleend
  282. ; Sample end will be reached: calculate how many bytes can be mixed.
  283. ; (This calculation requires that remaining buffer size fits in a word.)
  284. msm2_calcsize    swap    d0    ;d0 already contains endoffs - offs
  285.         clr.w    d0    ;<< 16
  286.         sub.l    d4,d0    ; - fraction
  287.         subq.l    #1,d0    ; - 1
  288.         move.w    d5,d1    ;advance..
  289.         swap    d1
  290.         move.w    d6,d1    ;advfract.
  291.         divu.l    d1,d0
  292.         addq.w    #1,d0
  293.         sub.w    d0,d3        ;left_to_mix -= passsize
  294.         jsr    (a4)        ;mix/skip
  295.         cmp.l    ci_endoffset(a5),d2
  296.         bhs.s    msm2_sampleend
  297.         tst.w    d3
  298.         beq.s    msm2_savereg
  299. msm2_sampleend    btst    #CHFLAGB_LOOP,ci_flags(a5)
  300.         beq.s    msm2_mutechan
  301.         btst    #CHFLAGB_PINGPONG,ci_flags(a5)
  302.         bne.s    msm2_pingpong
  303.         sub.l    ci_restartoffset(a5),d2
  304.         move.l    ci_newstart_addr(a5),d0
  305.         beq.s    msm2_loopend
  306.         move.l    d0,ci_sample_start(a5)
  307.         move.l    ci_newendoffset(a5),d0
  308.         move.l    d0,ci_endoffset(a5)
  309.         move.l    d0,ci_restartoffset(a5)
  310. msm2_loopend    tst.w    d3    ;left_to_mix
  311.         bgt.s    msm2_loop2
  312.         bra.s    msm2_savereg
  313. msm2_mutechan    bset    #CHFLAGB_MUTED,ci_flags(a5)
  314. ; --- save registers after mixing
  315. msm2_savereg
  316.         movem.l    d2/d4,ci_mixregs(a5)
  317. msm2_chloopend    adda.w    #ci_sizeof,a5
  318.         dbra    d7,msm2_chloop
  319.         movem.l    (sp)+,d2-d7/a2-a6
  320.         rts
  321.  
  322. ; swap mixing routine (change direction)
  323. msm2_pingpong    move.l    ci_altmixroutine(a5),d0
  324.         move.l    a4,ci_altmixroutine(a5)
  325.         movea.l    d0,a4
  326.         move.l    d0,ci_mixroutine(a5)
  327.         bchg    #CHFLAGB_BACKW,ci_flags(a5)
  328. ; loop beginning -> loop end
  329.         move.l    ci_endoffset(a5),d0
  330. ; turn pointer to the other side of the previous end offset
  331.         sub.l    d0,d2
  332.         neg.l    d2
  333.         add.l    d0,d2
  334.         sub.l    ci_restartoffset(a5),d0
  335.         move.l    d0,ci_endoffset(a5)
  336.         tst.w    d3
  337.         beq.s    msm2_savereg
  338. msm2_backwards    
  339. msmb2_loop2    ;while(left_to_mix > 0)...
  340.         move.l    d5,d1    ;d1 = advance
  341. ; Tests whether current sample end is reached within remaining
  342. ; space in mixing buffer.
  343.         ext.l    d3
  344.         swap    d1
  345.         move.w    d6,d1
  346.         mulu.l    d3,d0:d1
  347.         move.w    d0,d1
  348.         swap    d1
  349.         move.l    d2,d0
  350.         sub.l    ci_endoffset(a5),d0    ;d0 = offset - endoffset
  351.         ble.s    msm2_mutechan    ;loop too short
  352.         cmp.l    d0,d1
  353.         bhs.s    msmb2_calcsize
  354. ; Sample end won't be reached... just fill the remaining mix buffer
  355. ; size straight away.
  356.         move.w    d3,d0
  357.         jsr    (a4)
  358.         cmp.l    ci_endoffset(a5),d2
  359.         bgt.s    msm2_savereg
  360.         moveq    #0,d3
  361.         bra.s    msmb2_sampleend
  362. ; Sample end will be reached: calculate how many bytes can be mixed.
  363. ; (This calculation requires that remaining buffer size fits in a word.)
  364. msmb2_calcsize    swap    d0    ;d0 already contains endoffs - offs
  365.         clr.w    d0    ;<< 16
  366.         sub.l    d4,d0    ; - fraction
  367.         subq.l    #1,d0    ; - 1
  368.         move.w    d5,d1    ;advance..
  369.         swap    d1
  370.         move.w    d6,d1    ;advfract.
  371.         divu.l    d1,d0
  372.         addq.w    #1,d0
  373.         sub.w    d0,d3        ;left_to_mix -= passsize
  374.         jsr    (a4)        ;mix/skip
  375.         cmp.l    ci_endoffset(a5),d2
  376.         ble.s    msmb2_sampleend
  377.         tst.w    d3
  378.         beq.s    msm2_savereg
  379. msmb2_sampleend    btst    #CHFLAGB_LOOP,ci_flags(a5)
  380.         beq.s    msm2_mutechan
  381.         btst    #CHFLAGB_PINGPONG,ci_flags(a5)
  382.         bne.s    msm2_pingpong2
  383.         add.l    ci_restartoffset(a5),d2
  384.         tst.w    d3    ;left_to_mix
  385.         bgt.s    msmb2_loop2
  386.         bra.s    msm2_savereg
  387.  
  388. ; swap mixing routine (change direction)
  389. msm2_pingpong2    move.l    ci_altmixroutine(a5),d0
  390.         move.l    a4,ci_altmixroutine(a5)
  391.         movea.l    d0,a4
  392.         move.l    d0,ci_mixroutine(a5)
  393.         bchg    #CHFLAGB_BACKW,ci_flags(a5)
  394. ; loop beginning -> loop end
  395.         move.l    ci_endoffset(a5),d0
  396. ; turn pointer to the other side of the previous end offset
  397.         sub.l    d0,d2
  398.         neg.l    d2
  399.         add.l    d0,d2
  400.         add.l    ci_restartoffset(a5),d0
  401.         move.l    d0,ci_endoffset(a5)
  402.         tst.w    d3
  403.         bgt.s    msm2_loop2
  404.         bra.s    msm2_savereg
  405.     ENDC
  406.  
  407.     IFNE    SUPPORT_000
  408. ; Skip mix pass (just advance pointers)
  409. Skip        move.w    d0,d1    ;passsize...
  410.         mulu    d6,d0    ;* advfract
  411.         mulu    d5,d1    ;* advance
  412.         add.l    d1,d2    ;offset += passsize * advance
  413.         add.w    d0,d4    ;add fraction
  414.         clr.w    d0
  415.         swap    d0    ;get upper word
  416.         addx.l    d0,d2    ;add to offset.
  417.         rts
  418.  
  419. Skipb        move.w    d0,d1    ;passsize...
  420.         mulu    d6,d0    ;* advfract
  421.         mulu    d5,d1    ;* advance
  422.         sub.l    d1,d2    ;offset -= passsize * advance
  423.         add.w    d0,d4    ;add fraction
  424.         clr.w    d0
  425.         swap    d0    ;get upper word
  426.         subx.l    d0,d2    ;add to offset.
  427.         rts
  428.     ENDC
  429.  
  430.     IFNE    SUPPORT_020
  431. Skip_020    move.w    d5,d1
  432.         swap    d1
  433.         move.w    d6,d1
  434.         ext.l    d0
  435.         mulu.l    d0,d0:d1
  436.         add.w    d1,d4    ,add fraction
  437.         move.w    d0,d1
  438.         swap    d1
  439.         addx.l    d1,d2    ;add offset
  440.         rts
  441.  
  442. Skipb_020    move.w    d5,d1
  443.         swap    d1
  444.         move.w    d6,d1
  445.         ext.l    d0
  446.         mulu.l    d0,d0:d1
  447.         add.w    d1,d4    ,add fraction
  448.         move.w    d0,d1
  449.         swap    d1
  450.         subx.l    d1,d2    ;add offset
  451.         rts
  452.     ENDC
  453.  
  454.     IFNE    SUPPORT_SMOOTH
  455. ; -------------------------------------------------------------------
  456. ; Mixing routines: Mono, 8/16-bit, forwards/backwards, smooth
  457. ; -------------------------------------------------------------------
  458.  
  459.         addq.l    #1,d2
  460.         rts
  461. GetNextSample    move.l    ci_endoffset(a5),d3
  462.         subq.l    #1,d3
  463.         cmp.l    d3,d2
  464.         bhs.s    gns_end
  465.         moveq    #0,d3
  466.         move.b    1(a6,d2.l),d3
  467.         bra.s    gns_noloop
  468. gns_end        moveq    #0,d3
  469.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  470.         beq.s    gns_noloop
  471.         move.l    d2,-(sp)
  472.         sub.l    ci_restartoffset(a5),d2
  473.         tst.l    ci_newstart_addr(a5)
  474.         beq.s    1$
  475.         move.l    a6,-(sp)
  476.         movea.l    ci_newstart_addr(a5),a6
  477.         btst    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  478.         beq.s    3$
  479.         adda.l    ci_rightch_offs(a5),a6
  480. 3$        move.b    1(a6,d2.l),d3
  481.         move.l    (sp)+,a6
  482.         bra.s    2$
  483. 1$        move.b    1(a6,d2.l),d3
  484. 2$        move.l    (sp)+,d2
  485. gns_noloop    add.w    d3,d3
  486.         move.w    0(a3,d3.w),d3
  487.         btst    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  488.         bne.s    1$
  489.         move.w    d3,ci_nextsample(a5)
  490.         rts
  491. 1$        move.w    d3,ci_nextsample_r(a5)
  492.         rts
  493.  
  494.         subq.l    #1,d2
  495.         rts
  496. GetNextSampleB    move.l    ci_endoffset(a5),d3
  497.         addq.l    #1,d3
  498.         cmp.l    d3,d2
  499.         ble.s    gnsb_end
  500.         moveq    #0,d3
  501.         move.b    -1(a6,d2.l),d3
  502.         bra.s    gns_noloop
  503. gnsb_end    moveq    #0,d3
  504.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  505.         beq.s    gns_noloop
  506.         move.l    d2,-(sp)
  507.         add.l    ci_restartoffset(a5),d2
  508.         move.b    -1(a6,d2.l),d3
  509.         move.l    (sp)+,d2
  510.         bra.s    gns_noloop
  511.  
  512.         subq.l    #1,d2
  513.         rts
  514. GetNextSample_16B
  515.         move.l    ci_endoffset(a5),d3
  516.         addq.l    #1,d3
  517.         cmp.l    d3,d2
  518.         ble.s    gnsb16_end
  519.         move.l    d2,d3
  520.         add.l    d3,d3
  521.         move.w    -2(a6,d3.l),d3
  522.         bra.s    gns16_noloop
  523. gnsb16_end    moveq    #0,d3
  524.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  525.         beq.s    gns16_noloop
  526.         move.l    d2,-(sp)
  527.         add.l    ci_restartoffset(a5),d2
  528.         move.l    d2,d3
  529.         add.l    d3,d3
  530.         move.w    2(a6,d3.l),d3
  531.         move.l    (sp)+,d2
  532.         bra.s    gns16_noloop
  533.  
  534.         addq.l    #1,d2
  535.         rts
  536. GetNextSample_16
  537.         move.l    ci_endoffset(a5),d3
  538.         subq.l    #1,d3
  539.         cmp.l    d3,d2
  540.         bhs.s    gns16_end
  541.         move.l    d2,d3
  542.         add.l    d3,d3
  543.         move.w    2(a6,d3.l),d3
  544.         bra.s    gns16_noloop
  545. gns16_end    moveq    #0,d3
  546.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  547.         beq.s    gns16_noloop
  548.         move.l    d2,-(sp)
  549.         sub.l    ci_restartoffset(a5),d2
  550.         move.l    d2,d3
  551.         add.l    d3,d3
  552.         tst.l    ci_newstart_addr(a5)
  553.         beq.s    1$
  554.         move.l    a6,-(sp)
  555.         movea.l    ci_newstart_addr(a5),a6
  556.         move.w    2(a6,d3.l),d3
  557.         move.l    (sp)+,a6
  558.         bra.s    2$
  559. 1$        move.w    2(a6,d3.l),d3
  560. 2$        move.l    (sp)+,d2
  561. gns16_noloop    asr.w    d7,d3
  562.         btst    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  563.         bne.s    1$
  564.         move.w    d3,ci_nextsample(a5)
  565.         rts
  566. 1$        move.w    d3,ci_nextsample_r(a5)
  567.         rts
  568.         rts
  569.  
  570. sMIX_mono8    movea.l    ci_sample_start(a5),a6
  571.         movea.l    ci_voltable_l(a5),a3
  572.         subq.w    #1,d0
  573.         tst.w    d5
  574.         bne.s    sMIX_avg
  575.         movem.l    d3/d5/a4,-(sp)
  576.         bsr.w    GetCurrS_8
  577.         move.w    d1,ci_currsample(a5)
  578.         lea    GetNextSample(pc),a4
  579.         bsr.w    sMIX_monoloop
  580.         movem.l    (sp)+,d3/d5/a4
  581.         rts
  582. sMIX_avg    movem.l    a1/a4,-(sp)
  583.         lea    GetCurrS_8(pc),a1
  584.         lea    GetS_1(pc),a4
  585.         bsr.w    sMIX_avgmono
  586.         movem.l    (sp)+,a1/a4
  587.         rts
  588.  
  589. sMIXb_mono8    movea.l    ci_sample_start(a5),a6
  590.         movea.l    ci_voltable_l(a5),a3
  591.         subq.w    #1,d0
  592.         tst.w    d5
  593.         bne.s    sMIXb_avg
  594.         movem.l    d3/d5/a4,-(sp)
  595.         bsr.w    GetCurrS_8
  596.         move.w    d1,ci_currsample(a5)
  597.         lea    GetNextSampleB(pc),a4
  598.         bsr.w    sMIX_monoloop
  599.         movem.l    (sp)+,d3/d5/a4
  600.         rts
  601. sMIXb_avg    movem.l    a1/a4,-(sp)
  602.         lea    GetCurrS_8(pc),a1
  603.         lea    GetS_1b(pc),a4
  604.         bsr.w    sMIX_avgmono
  605.         movem.l    (sp)+,a1/a4
  606.         rts
  607.  
  608. sMIX_mono16    movea.l    ci_sample_start(a5),a6
  609.         subq.w    #1,d0
  610.         tst.w    d5
  611.         bne.s    sMIX_avg16
  612.         movem.l    d3/d5/d7/a4,-(sp)
  613.         move.w    ci_volshift_l(a5),d7
  614.         bsr.w    GetCurrS_16
  615.         move.w    d1,ci_currsample(a5)
  616.         lea    GetNextSample_16(pc),a4
  617.         bsr.s    sMIX_monoloop
  618.         movem.l    (sp)+,d3/d5/d7/a4
  619.         rts
  620. sMIX_avg16    movem.l    a1/a4/d7,-(sp)
  621.         lea    GetS_1_16(pc),a4
  622.         lea    GetCurrS_16(pc),a1
  623.         move.w    ci_volshift_l(a5),d7
  624.         bsr.w    sMIX_avgmono
  625.         movem.l    (sp)+,a1/a4/d7
  626.         rts
  627.  
  628. sMIXb_mono16    movea.l    ci_sample_start(a5),a6
  629.         subq.w    #1,d0
  630.         tst.w    d5
  631.         bne.s    sMIXb_avg16
  632.         movem.l    d3/d5/d7/a4,-(sp)
  633.         move.w    ci_volshift_l(a5),d7
  634.         bsr.w    GetCurrS_16
  635.         move.w    d1,ci_currsample(a5)
  636.         lea    GetNextSample_16B(pc),a4
  637.         bsr.s    sMIX_monoloop
  638.         movem.l    (sp)+,d3/d5/d7/a4
  639.         rts
  640. sMIXb_avg16    movem.l    a1/a4/d7,-(sp)
  641.         lea    GetS_1_16b(pc),a4
  642.         lea    GetCurrS_16(pc),a1
  643.         move.w    ci_volshift_l(a5),d7
  644.         bsr.w    sMIX_avgmono
  645.         movem.l    (sp)+,a1/a4/d7
  646.         rts
  647.  
  648. sMIX_monoloop    jsr    (a4)
  649. 1$        move.w    ci_currsample(a5),d1
  650.         ext.l    d1
  651.         move.w    ci_prevsample(a5),d5
  652.         ext.l    d5
  653.         sub.l    d1,d5
  654.         neg.l    d5        ;f' at fract 0 (curr - prev)
  655.         move.w    ci_nextsample(a5),d3
  656.         ext.l    d3
  657.         sub.l    d1,d3        ;f' at fract $FFFF (next - curr)
  658.         sub.l    d5,d3        ;f'' during the curr. sample
  659.         lsr.l    #2,d3
  660.         lsr.w    #1,d4
  661.         muls    d4,d3        ;get f'' at curr. fract
  662.         roxl.w    #1,d4
  663.         swap    d3        ;/ 0x10000
  664.         ext.l    d3
  665.         asl.l    #2,d3
  666.         add.l    d5,d3        ;add initial f' at fract 0
  667.         lsr.l    #2,d3
  668.         lsr.w    #1,d4
  669.         muls    d4,d3
  670.         roxl.w    #1,d4
  671.         asl.l    #3,d3
  672.         swap    d3        ;/ 0x10000
  673.         move.w    ci_prevsample(a5),d5
  674.         ext.l    d5
  675.         add.l    d5,d1
  676.         lsr.l    #1,d1
  677.         add.w    d3,d1        ;add to initial sample value
  678.         bvc.s    2$
  679.         move.w    ci_currsample(a5),d1
  680. 2$        add.w    d1,(a2)+
  681.         add.w    d6,d4        ;actually advance fraction
  682.         bcc.s    4$
  683.         jsr    -4(a4)    ;add (or subtract) one to offset
  684.         move.l    ci_currsample(a5),ci_prevsample(a5)
  685.         jsr    (a4)
  686. 4$        dbra    d0,1$
  687.         rts
  688.  
  689. GetCurrS_8    moveq    #0,d1
  690.         move.b    0(a6,d2.l),d1    ;current sample
  691.         add.w    d1,d1
  692.         move.w    0(a3,d1.w),d1
  693.         rts
  694.  
  695. GetCurrS_16    move.l    d2,d1
  696.         add.l    d1,d1
  697.         move.w    0(a6,d1.l),d1
  698.         asr.w    d7,d1
  699.         rts
  700.  
  701. sMIX_avgmono    move.l    d3,-(sp)
  702. 1$        move.w    d4,d3
  703.         not.w    d3        ;what's left of current sample
  704.         jsr    (a1)
  705.         lsr.w    #1,d3
  706.         muls    d1,d3
  707.         asr.l    #7,d3        ;/ 256..
  708.         move.w    d5,-(sp)
  709.         move.w    d6,-(sp)
  710.         move.w    d4,d6
  711.         not.w    d6
  712.         lsr.w    #8,d6        ;divisor
  713.         add.l    -4(a4),d2    ;advance offset
  714.         subq.w    #2,d5
  715.         bmi.s    2$        ;no full samples to skip
  716. 3$        jsr    (a4)
  717.         add.l    -4(a4),d2    ;advance offset
  718.         swap    d1
  719.         asr.l    #8,d1
  720.         add.l    d1,d3
  721.         dbra    d5,3$
  722. 2$        add.w    (sp),d4        ;d6 = (sp) = advfract
  723.         bcc.s    4$
  724.         jsr    (a4)
  725.         add.l    -4(a4),d2    ;advance offset
  726.         swap    d1
  727.         asr.l    #8,d1
  728.         add.l    d1,d3
  729. 4$        jsr    4(a4)        ;get last (partial) sample
  730.         move.w    d4,d5
  731.         lsr.w    #8,d5
  732.         add.w    d5,d6
  733.         move.w    d4,d5
  734.         lsr.w    #1,d5
  735.         muls    d5,d1
  736.         asr.l    #7,d1
  737.         add.l    d1,d3
  738.         divs    d6,d3        ;divide to get average
  739.         move.w    (sp)+,d6
  740.         move.w    (sp)+,d5
  741.         add.w    d3,(a2)+
  742.         dbra    d0,1$
  743.         move.l    (sp)+,d3
  744.         rts
  745.  
  746.         dc.l    1
  747. GetS_1        add.w    #$100,d6
  748.         moveq    #0,d1
  749.         move.l    d6,-(sp)
  750.         move.l    d2,d6
  751.         cmp.l    ci_endoffset(a5),d6
  752.         bls.s    aag_ok
  753.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  754.         beq.s    aag_noloop
  755.         sub.l    ci_restartoffset(a5),d6
  756. aag_ok        move.b    0(a6,d6.l),d1
  757.         add.w    d1,d1
  758.         move.w    0(a3,d1.w),d1
  759.         ;move.w    d1,ci_prevsample(a5)
  760. aag_noloop    move.l    (sp)+,d6
  761.         rts
  762.  
  763.         dc.l    1
  764. GetS_1_16    add.w    #$100,d6
  765.         moveq    #0,d1
  766.         move.l    d6,-(sp)
  767.         move.l    d2,d6
  768.         cmp.l    ci_endoffset(a5),d6
  769.         bls.s    aag16_ok
  770.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  771.         beq.s    aag16_noloop
  772.         sub.l    ci_restartoffset(a5),d6
  773. aag16_ok    add.l    d6,d6
  774.         move.w    0(a6,d6.l),d1
  775.         asr.w    d7,d1
  776.         ;move.w    d1,ci_prevsample(a5)
  777. aag16_noloop    move.l    (sp)+,d6
  778.         rts
  779.  
  780.         dc.l    -1
  781. GetS_1b        add.w    #$100,d6
  782.         moveq    #0,d1
  783.         move.l    d6,-(sp)
  784.         move.l    d2,d6
  785.         cmp.l    ci_endoffset(a5),d6
  786.         bge.s    aag_ok
  787.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  788.         beq.s    aag_noloop
  789.         add.l    ci_restartoffset(a5),d6
  790.         bra.s    aag_ok
  791.  
  792.         dc.l    -1
  793. GetS_1_16b    add.w    #$100,d6
  794.         moveq    #0,d1
  795.         move.l    d6,-(sp)
  796.         move.l    d2,d6
  797.         cmp.l    ci_endoffset(a5),d6
  798.         bge.s    aag16_ok
  799.         btst    #CHFLAGB_LOOP,ci_flags(a5)
  800.         beq.s    aag16_noloop
  801.         add.l    ci_restartoffset(a5),d6
  802.         bra.s    aag16_ok
  803.  
  804. ; -------------------------------------------------------------------
  805. ; Mixing routines: Stereo, 8/16-bit, forwards/backwards, smooth
  806. ; -------------------------------------------------------------------
  807.  
  808. sMIX_stereo8l    movea.l    ci_sample_start(a5),a6
  809.         movea.l    ci_voltable_l(a5),a3
  810.         subq.w    #1,d0
  811.         tst.w    d5
  812.         bne.s    1$
  813.         movem.l    d3/d5/a4,-(sp)
  814.         bsr.w    GetCurrS_8
  815.         move.w    d1,ci_currsample(a5)
  816.         lea    GetNextSample(pc),a4
  817.         bsr.w    sMIX_leftloop
  818.         movem.l    (sp)+,d3/d5/a4
  819.         rts
  820. 1$        movem.l    a1/a4,-(sp)
  821.         lea    GetCurrS_8(pc),a1
  822.         lea    GetS_1(pc),a4
  823.         bsr.w    sMIX_avgleft
  824.         movem.l    (sp)+,a1/a4
  825.         rts
  826.  
  827. sMIXb_stereo8l    movea.l    ci_sample_start(a5),a6
  828.         movea.l    ci_voltable_l(a5),a3
  829.         subq.w    #1,d0
  830.         tst.w    d5
  831.         bne.s    1$
  832.         movem.l    d3/d5/a4,-(sp)
  833.         bsr.w    GetCurrS_8
  834.         move.w    d1,ci_currsample(a5)
  835.         lea    GetNextSampleB(pc),a4
  836.         bsr.w    sMIX_leftloop
  837.         movem.l    (sp)+,d3/d5/a4
  838.         rts
  839. 1$        movem.l    a1/a4,-(sp)
  840.         lea    GetCurrS_8(pc),a1
  841.         lea    GetS_1b(pc),a4
  842.         bsr.w    sMIX_avgleft
  843.         movem.l    (sp)+,a1/a4
  844.         rts
  845.  
  846. sMIX_stereo8r    movea.l    ci_sample_start(a5),a6
  847.         adda.l    ci_rightch_offs(a5),a6
  848.         movea.l    ci_voltable_r(a5),a3
  849.         subq.w    #1,d0
  850.         tst.w    d5
  851.         bne.s    1$
  852.         movem.l    d3/d5/a4,-(sp)
  853.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  854.         bsr.w    GetCurrS_8
  855.         move.w    d1,ci_currsample_r(a5)
  856.         lea    GetNextSample(pc),a4
  857.         bsr.w    sMIX_rightloop
  858.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  859.         movem.l    (sp)+,d3/d5/a4
  860.         rts
  861. 1$        movem.l    a1/a4,-(sp)
  862.         lea    GetCurrS_8(pc),a1
  863.         lea    GetS_1(pc),a4
  864.         bsr.w    sMIX_avgright
  865.         movem.l    (sp)+,a1/a4
  866.         rts
  867.  
  868. sMIXb_stereo8r    movea.l    ci_sample_start(a5),a6
  869.         adda.l    ci_rightch_offs(a5),a6
  870.         movea.l    ci_voltable_r(a5),a3
  871.         subq.w    #1,d0
  872.         tst.w    d5
  873.         bne.s    1$
  874.         movem.l    d3/d5/a4,-(sp)
  875.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  876.         bsr.w    GetCurrS_8
  877.         move.w    d1,ci_currsample_r(a5)
  878.         lea    GetNextSampleB(pc),a4
  879.         bsr.w    sMIX_rightloop
  880.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  881.         movem.l    (sp)+,d3/d5/a4
  882.         rts
  883. 1$        movem.l    a1/a4,-(sp)
  884.         lea    GetCurrS_8(pc),a1
  885.         lea    GetS_1b(pc),a4
  886.         bsr.w    sMIX_avgright
  887.         movem.l    (sp)+,a1/a4
  888.         rts
  889.  
  890. sMIX_stereo8    movea.l    ci_voltable_l(a5),a3
  891.         bra.s    sMIX_st8
  892. sMIX_stereo8c    movea.l    ci_voltable_l(a5),a3
  893.         move.l    a3,ci_voltable_r(a5)
  894. sMIX_st8    movea.l    ci_sample_start(a5),a6
  895.         subq.w    #1,d0
  896.         tst.w    d5
  897.         bne.s    1$
  898.         movem.l    d3/d5/a4,-(sp)
  899.         movem.l    d0/d2/d4/a2,-(sp)
  900.         bsr.w    GetCurrS_8
  901.         move.w    d1,ci_currsample(a5)
  902.         lea    GetNextSample(pc),a4
  903.         bsr.w    sMIX_leftloop
  904.         movem.l    (sp)+,d0/d2/d4/a2
  905.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  906.         movea.l    ci_voltable_r(a5),a3
  907.         movea.l    ci_sample_start(a5),a6
  908.         adda.l    ci_rightch_offs(a5),a6
  909.         bsr.w    GetCurrS_8
  910.         move.w    d1,ci_currsample_r(a5)
  911.         bsr.w    sMIX_rightloop
  912.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  913.         movem.l    (sp)+,d3/d5/a4
  914.         rts
  915. 1$        movem.l    a1/a4,-(sp)
  916.         lea    GetCurrS_8(pc),a1
  917.         lea    GetS_1(pc),a4
  918.         movem.l    d0/d2/d4/a2,-(sp)
  919.         bsr.    sMIX_avgleft
  920.         movem.l    (sp)+,d0/d2/d4/a2
  921.         movea.l    ci_voltable_r(a5),a3
  922.         bsr.w    sMIX_avgright
  923.         movem.l    (sp)+,a1/a4
  924.         rts
  925.  
  926. sMIXb_stereo8    movea.l    ci_voltable_l(a5),a3
  927.         bra.s    sMIXb_st8
  928. sMIXb_stereo8c    movea.l    ci_voltable_l(a5),a3
  929.         move.l    a3,ci_voltable_r(a5)
  930. sMIXb_st8    movea.l    ci_sample_start(a5),a6
  931.         subq.w    #1,d0
  932.         tst.w    d5
  933.         bne.s    1$
  934.         movem.l    d3/d5/a4,-(sp)
  935.         movem.l    d0/d2/d4/a2,-(sp)
  936.         bsr.w    GetCurrS_8
  937.         move.w    d1,ci_currsample(a5)
  938.         lea    GetNextSampleB(pc),a4
  939.         bsr.w    sMIX_leftloop
  940.         movem.l    (sp)+,d0/d2/d4/a2
  941.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  942.         movea.l    ci_voltable_r(a5),a3
  943.         movea.l    ci_sample_start(a5),a6
  944.         adda.l    ci_rightch_offs(a5),a6
  945.         bsr.w    GetCurrS_8
  946.         move.w    d1,ci_currsample_r(a5)
  947.         bsr.w    sMIX_rightloop
  948.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  949.         movem.l    (sp)+,d3/d5/a4
  950.         rts
  951. 1$        movem.l    a1/a4,-(sp)
  952.         lea    GetCurrS_8(pc),a1
  953.         lea    GetS_1b(pc),a4
  954.         movem.l    d0/d2/d4/a2,-(sp)
  955.         bsr.    sMIX_avgleft
  956.         movem.l    (sp)+,d0/d2/d4/a2
  957.         movea.l    ci_voltable_r(a5),a3
  958.         bsr.w    sMIX_avgright
  959.         movem.l    (sp)+,a1/a4
  960.         rts
  961.  
  962. sMIX_stereo16l    movea.l    ci_sample_start(a5),a6
  963.         subq.w    #1,d0
  964.         tst.w    d5
  965.         bne.s    1$
  966.         movem.l    d3/d5/d7/a4,-(sp)
  967.         move.w    ci_volshift_l(a5),d7
  968.         bsr.w    GetCurrS_16
  969.         move.w    d1,ci_currsample(a5)
  970.         lea    GetNextSample_16(pc),a4
  971.         bsr.w    sMIX_leftloop
  972.         movem.l    (sp)+,d3/d5/d7/a4
  973.         rts
  974. 1$        movem.l    a1/a4/d7,-(sp)
  975.         move.w    ci_volshift_l(a5),d7
  976.         lea    GetCurrS_16(pc),a1
  977.         lea    GetS_1_16(pc),a4
  978.         bsr.w    sMIX_avgleft
  979.         movem.l    (sp)+,a1/a4/d7
  980.         rts
  981.  
  982. sMIXb_stereo16l    movea.l    ci_sample_start(a5),a6
  983.         subq.w    #1,d0
  984.         tst.w    d5
  985.         bne.s    1$
  986.         movem.l    d3/d5/d7/a4,-(sp)
  987.         move.w    ci_volshift_l(a5),d7
  988.         bsr.w    GetCurrS_16
  989.         move.w    d1,ci_currsample(a5)
  990.         lea    GetNextSample_16B(pc),a4
  991.         bsr.w    sMIX_leftloop
  992.         movem.l    (sp)+,d3/d5/d7/a4
  993.         rts
  994. 1$        movem.l    a1/a4/d7,-(sp)
  995.         move.w    ci_volshift_l(a5),d7
  996.         lea    GetCurrS_16(pc),a1
  997.         lea    GetS_1_16b(pc),a4
  998.         bsr.w    sMIX_avgleft
  999.         movem.l    (sp)+,a1/a4/d7
  1000.         rts
  1001.  
  1002. sMIX_stereo16r    movea.l    ci_sample_start(a5),a6
  1003.         adda.l    ci_rightch_offs(a5),a6
  1004.         subq.w    #1,d0
  1005.         tst.w    d5
  1006.         bne.s    1$
  1007.         movem.l    d3/d5/d7/a4,-(sp)
  1008.         move.w    ci_volshift_r(a5),d7
  1009.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1010.         bsr.w    GetCurrS_16
  1011.         move.w    d1,ci_currsample_r(a5)
  1012.         lea    GetNextSample_16(pc),a4
  1013.         bsr.w    sMIX_rightloop
  1014.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1015.         movem.l    (sp)+,d3/d5/d7/a4
  1016.         rts
  1017. 1$        movem.l    a1/a4/d7,-(sp)
  1018.         move.w    ci_volshift_r(a5),d7
  1019.         lea    GetCurrS_16(pc),a1
  1020.         lea    GetS_1_16(pc),a4
  1021.         bsr.w    sMIX_avgright
  1022.         movem.l    (sp)+,a1/a4/d7
  1023.         rts
  1024.  
  1025. sMIXb_stereo16r    movea.l    ci_sample_start(a5),a6
  1026.         adda.l    ci_rightch_offs(a5),a6
  1027.         subq.w    #1,d0
  1028.         tst.w    d5
  1029.         bne.s    1$
  1030.         movem.l    d3/d5/d7/a4,-(sp)
  1031.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1032.         move.w    ci_volshift_r(a5),d7
  1033.         bsr.w    GetCurrS_16
  1034.         move.w    d1,ci_currsample_r(a5)
  1035.         lea    GetNextSample_16B(pc),a4
  1036.         bsr.w    sMIX_rightloop
  1037.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1038.         movem.l    (sp)+,d3/d5/d7/a4
  1039.         rts
  1040. 1$        movem.l    d7/a1/a4,-(sp)
  1041.         move.w    ci_volshift_r(a5),d7
  1042.         lea    GetCurrS_16(pc),a1
  1043.         lea    GetS_1_16b(pc),a4
  1044.         bsr.w    sMIX_avgright
  1045.         movem.l    (sp)+,d7/a1/a4
  1046.         rts
  1047.  
  1048. sMIX_stereo16c    move.w    ci_volshift_l(a5),ci_volshift_r(a5)
  1049. sMIX_stereo16    movea.l    ci_sample_start(a5),a6
  1050.         subq.w    #1,d0
  1051.         tst.w    d5
  1052.         bne.s    1$
  1053.         movem.l    d3/d5/d7/a4,-(sp)
  1054.         movem.l    d0/d2/d4/a2,-(sp)
  1055.         move.w    ci_volshift_l(a5),d7
  1056.         bsr.w    GetCurrS_16
  1057.         move.w    d1,ci_currsample(a5)
  1058.         lea    GetNextSample_16(pc),a4
  1059.         bsr.w    sMIX_leftloop
  1060.         movem.l    (sp)+,d0/d2/d4/a2
  1061.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1062.         move.w    ci_volshift_r(a5),d7
  1063.         movea.l    ci_sample_start(a5),a6
  1064.         adda.l    ci_rightch_offs(a5),a6
  1065.         bsr.w    GetCurrS_16
  1066.         move.w    d1,ci_currsample_r(a5)
  1067.         bsr.w    sMIX_rightloop
  1068.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1069.         movem.l    (sp)+,d3/d5/d7/a4
  1070.         rts
  1071. 1$        movem.l    d7/a1/a4,-(sp)
  1072.         lea    GetCurrS_16(pc),a1
  1073.         lea    GetS_1_16(pc),a4
  1074.         movem.l    d0/d2/d4/a2,-(sp)
  1075.         move.w    ci_volshift_l(a5),d7
  1076.         bsr.    sMIX_avgleft
  1077.         movem.l    (sp)+,d0/d2/d4/a2
  1078.         move.w    ci_volshift_r(a5),d7
  1079.         bsr.w    sMIX_avgright
  1080.         movem.l    (sp)+,d7/a1/a4
  1081.         rts
  1082.  
  1083. sMIXb_stereo16c    move.w    ci_volshift_l(a5),ci_volshift_r(a5)
  1084. sMIXb_stereo16    movea.l    ci_sample_start(a5),a6
  1085.         subq.w    #1,d0
  1086.         tst.w    d5
  1087.         bne.s    1$
  1088.         movem.l    d3/d5/d7/a4,-(sp)
  1089.         movem.l    d0/d2/d4/a2,-(sp)
  1090.         move.w    ci_volshift_l(a5),d7
  1091.         bsr.w    GetCurrS_16
  1092.         move.w    d1,ci_currsample(a5)
  1093.         lea    GetNextSample_16B(pc),a4
  1094.         bsr.w    sMIX_leftloop
  1095.         movem.l    (sp)+,d0/d2/d4/a2
  1096.         bset    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1097.         move.w    ci_volshift_r(a5),d7
  1098.         movea.l    ci_sample_start(a5),a6
  1099.         adda.l    ci_rightch_offs(a5),a6
  1100.         bsr.w    GetCurrS_16
  1101.         move.w    d1,ci_currsample_r(a5)
  1102.         bsr.w    sMIX_rightloop
  1103.         bclr    #CHFLAGB_MIXING_RIGHT,ci_flags(a5)
  1104.         movem.l    (sp)+,d3/d5/d7/a4
  1105.         rts
  1106. 1$        movem.l    d7/a1/a4,-(sp)
  1107.         lea    GetCurrS_16(pc),a1
  1108.         lea    GetS_1_16b(pc),a4
  1109.         movem.l    d0/d2/d4/a2,-(sp)
  1110.         move.w    ci_volshift_l(a5),d7
  1111.         bsr.    sMIX_avgleft
  1112.         movem.l    (sp)+,d0/d2/d4/a2
  1113.         move.w    ci_volshift_r(a5),d7
  1114.         bsr.w    sMIX_avgright
  1115.         movem.l    (sp)+,d7/a1/a4
  1116.         rts
  1117.  
  1118. sMIX_leftloop    jsr    (a4)
  1119. 1$        move.w    ci_currsample(a5),d1
  1120.         ext.l    d1
  1121.         move.w    ci_prevsample(a5),d5
  1122.         ext.l    d5
  1123.         sub.l    d1,d5
  1124.         neg.l    d5        ;f' at fract 0 (curr - prev)
  1125.         move.w    ci_nextsample(a5),d3
  1126.         ext.l    d3
  1127.         sub.l    d1,d3        ;f' at fract $FFFF (next - curr)
  1128.         sub.l    d5,d3        ;f'' during the curr. sample
  1129.         lsr.l    #2,d3
  1130.         lsr.w    #1,d4
  1131.         muls    d4,d3        ;get f'' at curr. fract
  1132.         roxl.w    #1,d4
  1133.         swap    d3        ;/ 0x10000
  1134.         ext.l    d3
  1135.         asl.l    #2,d3
  1136.         add.l    d5,d3        ;add initial f' at fract 0
  1137.         lsr.l    #2,d3
  1138.         lsr.w    #1,d4
  1139.         muls    d4,d3
  1140.         roxl.w    #1,d4
  1141.         asl.l    #3,d3
  1142.         swap    d3        ;/ 0x10000
  1143.         move.w    ci_prevsample(a5),d5
  1144.         ext.l    d5
  1145.         add.l    d5,d1
  1146.         lsr.l    #1,d1
  1147.         add.w    d3,d1        ;add to initial sample value
  1148.         bvc.s    2$
  1149.         move.w    ci_currsample(a5),d1
  1150. 2$        add.w    d1,(a2)
  1151.         addq.l    #4,a2
  1152.         add.w    d6,d4        ;actually advance fraction
  1153.         bcc.s    4$
  1154.         jsr    -4(a4)    ;add (or subtract) one to offset
  1155.         move.l    ci_currsample(a5),ci_prevsample(a5)
  1156.         jsr    (a4)
  1157. 4$        dbra    d0,1$
  1158.         rts
  1159.  
  1160. sMIX_rightloop    jsr    (a4)
  1161. 1$        move.w    ci_currsample_r(a5),d1
  1162.         ext.l    d1
  1163.         move.w    ci_prevsample_r(a5),d5
  1164.         ext.l    d5
  1165.         sub.l    d1,d5
  1166.         neg.l    d5        ;f' at fract 0 (curr - prev)
  1167.         move.w    ci_nextsample_r(a5),d3
  1168.         ext.l    d3
  1169.         sub.l    d1,d3        ;f' at fract $FFFF (next - curr)
  1170.         sub.l    d5,d3        ;f'' during the curr. sample
  1171.         lsr.l    #2,d3
  1172.         lsr.w    #1,d4
  1173.         muls    d4,d3        ;get f'' at curr. fract
  1174.         roxl.w    #1,d4
  1175.         swap    d3        ;/ 0x10000
  1176.         ext.l    d3
  1177.         asl.l    #2,d3
  1178.         add.l    d5,d3        ;add initial f' at fract 0
  1179.         lsr.l    #2,d3
  1180.         lsr.w    #1,d4
  1181.         muls    d4,d3
  1182.         roxl.w    #1,d4
  1183.         asl.l    #3,d3
  1184.         swap    d3        ;/ 0x10000
  1185.         move.w    ci_prevsample_r(a5),d5
  1186.         ext.l    d5
  1187.         add.l    d5,d1
  1188.         lsr.l    #1,d1
  1189.         add.w    d3,d1        ;add to initial sample value
  1190.         bvc.s    2$
  1191.         move.w    ci_currsample(a5),d1
  1192. 2$        addq.l    #2,a2
  1193.         add.w    d1,(a2)+
  1194.         add.w    d6,d4        ;actually advance fraction
  1195.         bcc.s    4$
  1196.         jsr    -4(a4)    ;add (or subtract) one to offset
  1197.         move.l    ci_currsample_r(a5),ci_prevsample_r(a5)
  1198.         jsr    (a4)
  1199. 4$        dbra    d0,1$
  1200.         rts
  1201.  
  1202. sMIX_avgleft    move.l    d3,-(sp)
  1203. 1$        move.w    d4,d3
  1204.         not.w    d3        ;what's left of current sample
  1205.         jsr    (a1)
  1206.         lsr.w    #1,d3
  1207.         muls    d1,d3
  1208.         asr.l    #7,d3        ;/ 256..
  1209.         move.w    d5,-(sp)
  1210.         move.w    d6,-(sp)
  1211.         move.w    d4,d6
  1212.         not.w    d6
  1213.         lsr.w    #8,d6        ;divisor
  1214.         add.l    -4(a4),d2    ;advance offset
  1215.         subq.w    #2,d5
  1216.         bmi.s    2$        ;no full samples to skip
  1217. 3$        jsr    (a4)
  1218.         add.l    -4(a4),d2    ;advance offset
  1219.         swap    d1
  1220.         asr.l    #8,d1
  1221.         add.l    d1,d3
  1222.         dbra    d5,3$
  1223. 2$        add.w    (sp),d4        ;d6 = (sp) = advfract
  1224.         bcc.s    4$
  1225.         jsr    (a4)
  1226.         add.l    -4(a4),d2    ;advance offset
  1227.         swap    d1
  1228.         asr.l    #8,d1
  1229.         add.l    d1,d3
  1230. 4$        jsr    4(a4)        ;get last (partial) sample
  1231.         move.w    d4,d5
  1232.         lsr.w    #8,d5
  1233.         add.w    d5,d6
  1234.         move.w    d4,d5
  1235.         lsr.w    #1,d5
  1236.         muls    d5,d1
  1237.         asr.l    #7,d1
  1238.         add.l    d1,d3
  1239.         divs    d6,d3        ;divide to get average
  1240.         move.w    (sp)+,d6
  1241.         move.w    (sp)+,d5
  1242.         add.w    d3,(a2)
  1243.         addq.l    #4,a2
  1244.         dbra    d0,1$
  1245.         move.l    (sp)+,d3
  1246.         rts
  1247.  
  1248. sMIX_avgright    move.l    d3,-(sp)
  1249. 1$        move.w    d4,d3
  1250.         not.w    d3        ;what's left of current sample
  1251.         jsr    (a1)
  1252.         lsr.w    #1,d3
  1253.         muls    d1,d3
  1254.         asr.l    #7,d3        ;/ 256..
  1255.         move.w    d5,-(sp)
  1256.         move.w    d6,-(sp)
  1257.         move.w    d4,d6
  1258.         not.w    d6
  1259.         lsr.w    #8,d6        ;divisor
  1260.         add.l    -4(a4),d2    ;advance offset
  1261.         subq.w    #2,d5
  1262.         bmi.s    2$        ;no full samples to skip
  1263. 3$        jsr    (a4)
  1264.         add.l    -4(a4),d2    ;advance offset
  1265.         swap    d1
  1266.         asr.l    #8,d1
  1267.         add.l    d1,d3
  1268.         dbra    d5,3$
  1269. 2$        add.w    (sp),d4        ;d6 = (sp) = advfract
  1270.         bcc.s    4$
  1271.         jsr    (a4)
  1272.         add.l    -4(a4),d2    ;advance offset
  1273.         swap    d1
  1274.         asr.l    #8,d1
  1275.         add.l    d1,d3
  1276. 4$        jsr    4(a4)        ;get last (partial) sample
  1277.         move.w    d4,d5
  1278.         lsr.w    #8,d5
  1279.         add.w    d5,d6
  1280.         move.w    d4,d5
  1281.         lsr.w    #1,d5
  1282.         muls    d5,d1
  1283.         asr.l    #7,d1
  1284.         add.l    d1,d3
  1285.         divs    d6,d3        ;divide to get average
  1286.         move.w    (sp)+,d6
  1287.         move.w    (sp)+,d5
  1288.         addq.l    #2,a2
  1289.         add.w    d3,(a2)+
  1290.         dbra    d0,1$
  1291.         move.l    (sp)+,d3
  1292.         rts
  1293.     ENDC
  1294.  
  1295.     IFNE    SUPPORT_000
  1296. ; -------------------------------------------------------------------
  1297. ; Mixing routine: Mono, 16-bit, forwards, 68000
  1298. ; -------------------------------------------------------------------
  1299.  
  1300. MIX_mono16    movea.l    ci_sample_start(a5),a6
  1301.         move.l    d3,a3
  1302.         move.w    ci_volshift_l(a5),d3
  1303.         tst.w    d5
  1304.         beq.s    3$    ;advance zero
  1305.         lsr.w    #1,d0
  1306.         bcs.s    2$
  1307.         subq.w    #1,d0
  1308. 1$        move.l    d2,d1
  1309.         add.l    d1,d1    ;offset * 2
  1310.         move.w    0(a6,d1.l),d1    ;sample
  1311.         asr.w    d3,d1    ;scale volume
  1312.         add.w    d1,(a2)+
  1313.         add.w    d6,d4    ;fraction += advfract
  1314.         addx.l    d5,d2    ;offset += advance
  1315. 2$        move.l    d2,d1
  1316.         add.l    d1,d1    ;offset * 2
  1317.         move.w    0(a6,d1.l),d1    ;sample
  1318.         asr.w    d3,d1    ;scale volume
  1319.         add.w    d1,(a2)+
  1320.         add.w    d6,d4    ;fraction += advfract
  1321.         addx.l    d5,d2    ;offset += advance
  1322.         dbra    d0,1$
  1323.         move.l    a3,d3
  1324.         rts
  1325. 3$        add.l    d2,d2    ;temporarily mul by 2
  1326.         lsr.w    #1,d0
  1327.         bcs.s    5$
  1328.         subq.w    #1,d0
  1329. 4$        move.w    0(a6,d2.l),d1
  1330.         asr.w    d3,d1
  1331. 6$        add.w    d1,(a2)+
  1332.         add.w    d6,d4
  1333.         bcc.s    7$
  1334.         addq.l    #2,d2
  1335. 5$        move.w    0(a6,d2.l),d1
  1336.         asr.w    d3,d1
  1337. 7$        add.w    d1,(a2)+
  1338.         add.w    d6,d4
  1339.         bcs.s    8$
  1340.         dbra    d0,6$
  1341.         lsr.l    #1,d2
  1342.         move.l    a3,d3
  1343.         rts
  1344. 8$        addq.l    #2,d2
  1345.         dbra    d0,4$
  1346.         lsr.l    #1,d2
  1347.         move.l    a3,d3
  1348.         rts
  1349.  
  1350. ; -------------------------------------------------------------------
  1351. ; Mixing routine: Mono, 16-bit, backwards, 68000
  1352. ; -------------------------------------------------------------------
  1353.  
  1354. MIXb_mono16    movea.l    ci_sample_start(a5),a6
  1355.         move.l    d3,a3
  1356.         move.w    ci_volshift_l(a5),d3
  1357.         tst.w    d5
  1358.         beq.s    3$    ;advance zero
  1359.         lsr.w    #1,d0
  1360.         bcs.s    2$
  1361.         subq.w    #1,d0
  1362. 1$        move.l    d2,d1
  1363.         add.l    d1,d1    ;offset * 2
  1364.         move.w    0(a6,d1.l),d1    ;sample
  1365.         asr.w    d3,d1    ;scale volume
  1366.         add.w    d1,(a2)+
  1367.         add.w    d6,d4    ;fraction += advfract
  1368.         subx.l    d5,d2    ;offset -= advance
  1369. 2$        move.l    d2,d1
  1370.         add.l    d1,d1
  1371.         move.w    0(a6,d1.l),d1
  1372.         asr.w    d3,d1
  1373.         add.w    d1,(a2)+
  1374.         add.w    d6,d4
  1375.         subx.l    d5,d2
  1376.         dbra    d0,1$
  1377.         move.l    a3,d3
  1378.         rts
  1379. 3$        add.l    d2,d2    ;temporarily mul by 2
  1380.         lsr.w    #1,d0
  1381.         bcs.s    5$
  1382.         subq.w    #1,d0
  1383. 4$        move.w    0(a6,d2.l),d1
  1384.         asr.w    d3,d1
  1385. 6$        add.w    d1,(a2)+
  1386.         add.w    d6,d4
  1387.         bcc.s    7$
  1388.         subq.l    #2,d2
  1389. 5$        move.w    0(a6,d2.l),d1
  1390.         asr.w    d3,d1
  1391. 7$        add.w    d1,(a2)+
  1392.         add.w    d6,d4
  1393.         bcs.s    8$
  1394.         dbra    d0,6$
  1395.         asr.l    #1,d2
  1396.         move.l    a3,d3
  1397.         rts
  1398. 8$        subq.l    #2,d2
  1399.         dbra    d0,4$
  1400.         asr.l    #1,d2
  1401.         move.l    a3,d3
  1402.         rts
  1403.  
  1404. ; -------------------------------------------------------------------
  1405. ; Mixing routine: Mono, 8-bit, forwards, 68000
  1406. ; -------------------------------------------------------------------
  1407.  
  1408. MIX_mono8    movea.l    ci_sample_start(a5),a6
  1409.         movea.l    ci_voltable_l(a5),a3
  1410.         tst.w    d5
  1411.         beq.s    3$    ;advance zero
  1412.         lsr.w    #1,d0
  1413.         bcs.s    2$
  1414.         subq.w    #1,d0
  1415. 1$        moveq    #0,d1
  1416.         move.b    0(a6,d2.l),d1    ;sample
  1417.         add.w    d1,d1
  1418.         move.w    0(a3,d1.w),d1
  1419.         add.w    d1,(a2)+
  1420.         add.w    d6,d4    ;fraction += advfract
  1421.         addx.l    d5,d2    ;offset += advance
  1422. 2$        moveq    #0,d1
  1423.         move.b    0(a6,d2.l),d1
  1424.         add.w    d1,d1
  1425.         move.w    0(a3,d1.w),d1
  1426.         add.w    d1,(a2)+
  1427.         add.w    d6,d4
  1428.         addx.l    d5,d2
  1429.         dbra    d0,1$
  1430.         rts
  1431. 3$        lsr.w    #1,d0
  1432.         bcs.s    5$
  1433.         subq.w    #1,d0
  1434. 4$        moveq    #0,d1
  1435.         move.b    0(a6,d2.l),d1
  1436.         add.w    d1,d1
  1437.         move.w    0(a3,d1.w),d1
  1438. 6$        add.w    d1,(a2)+
  1439.         add.w    d6,d4
  1440.         bcc.s    7$
  1441.         addq.l    #1,d2
  1442. 5$        moveq    #0,d1
  1443.         move.b    0(a6,d2.l),d1
  1444.         add.w    d1,d1
  1445.         move.w    0(a3,d1.w),d1
  1446. 7$        add.w    d1,(a2)+
  1447.         add.w    d6,d4
  1448.         bcs.s    8$
  1449.         dbra    d0,6$
  1450.         rts
  1451. 8$        addq.l    #1,d2
  1452.         dbra    d0,4$
  1453.         rts
  1454.  
  1455. ; -------------------------------------------------------------------
  1456. ; Mixing routine: Mono, 8-bit, backwards, 68000
  1457. ; -------------------------------------------------------------------
  1458.  
  1459. MIXb_mono8    movea.l    ci_sample_start(a5),a6
  1460.         movea.l    ci_voltable_l(a5),a3
  1461.         tst.w    d5
  1462.         beq.s    3$    ;advance zero
  1463.         lsr.w    #1,d0
  1464.         bcs.s    2$
  1465.         subq.w    #1,d0
  1466. 1$        moveq    #0,d1
  1467.         move.b    0(a6,d2.l),d1    ;sample
  1468.         add.w    d1,d1
  1469.         move.w    0(a3,d1.w),d1
  1470.         add.w    d1,(a2)+
  1471.         add.w    d6,d4    ;fraction += advfract
  1472.         subx.l    d5,d2    ;offset += advance
  1473. 2$        moveq    #0,d1
  1474.         move.b    0(a6,d2.l),d1
  1475.         add.w    d1,d1
  1476.         move.w    0(a3,d1.w),d1
  1477.         add.w    d1,(a2)+
  1478.         add.w    d6,d4
  1479.         subx.l    d5,d2
  1480.         dbra    d0,1$
  1481.         rts
  1482. 3$        lsr.w    #1,d0
  1483.         bcs.s    5$
  1484.         subq.w    #1,d0
  1485. 4$        moveq    #0,d1
  1486.         move.b    0(a6,d2.l),d1
  1487.         add.w    d1,d1
  1488.         move.w    0(a3,d1.w),d1
  1489. 6$        add.w    d1,(a2)+
  1490.         add.w    d6,d4
  1491.         bcc.s    7$
  1492.         subq.l    #1,d2
  1493. 5$        moveq    #0,d1
  1494.         move.b    0(a6,d2.l),d1
  1495.         add.w    d1,d1
  1496.         move.w    0(a3,d1.w),d1
  1497. 7$        add.w    d1,(a2)+
  1498.         add.w    d6,d4
  1499.         bcs.s    8$
  1500.         dbra    d0,6$
  1501.         rts
  1502. 8$        subq.l    #1,d2
  1503.         dbra    d0,4$
  1504.         rts
  1505.     ENDC
  1506.  
  1507.     IFNE    SUPPORT_020
  1508. ; -------------------------------------------------------------------
  1509. ; Mixing routine: Mono, 16-bit, forwards, 68020+
  1510. ; -------------------------------------------------------------------
  1511.  
  1512. MIX_mono16_020    movea.l    ci_sample_start(a5),a6
  1513.         move.l    d3,a3
  1514.         move.w    ci_volshift_l(a5),d3
  1515.         tst.w    d5
  1516.         beq.s    3$    ;advance zero
  1517.         lsr.w    #1,d0
  1518.         bcs.s    2$
  1519.         subq.w    #1,d0
  1520. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  1521.         asr.w    d3,d1    ;scale volume
  1522.         add.w    d1,(a2)+
  1523.         add.w    d6,d4    ;fraction += advfract
  1524.         addx.l    d5,d2    ;offset += advance
  1525. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  1526.         asr.w    d3,d1    ;scale volume
  1527.         add.w    d1,(a2)+
  1528.         add.w    d6,d4    ;fraction += advfract
  1529.         addx.l    d5,d2    ;offset += advance
  1530.         dbra    d0,1$
  1531.         move.l    a3,d3
  1532.         rts
  1533. 3$        lea    0(a6,d2.l*2),a0
  1534.         lsr.w    #1,d0
  1535.         bcs.s    5$
  1536.         subq.w    #1,d0
  1537. 4$        move.w    (a0)+,d1
  1538.         asr.w    d3,d1
  1539. 6$        add.w    d1,(a2)+
  1540.         add.w    d6,d4
  1541.         bcc.s    7$
  1542. 5$        move.w    (a0)+,d1
  1543.         asr.w    d3,d1
  1544. 7$        add.w    d1,(a2)+
  1545.         add.w    d6,d4
  1546.         bcs.s    8$
  1547.         dbra    d0,6$
  1548.         suba.l    a6,a0
  1549.         move.l    a0,d2
  1550.         subq.l    #1,d2
  1551.         lsr.l    #1,d2
  1552.         move.l    a3,d3
  1553.         rts
  1554. 8$        dbra    d0,4$
  1555.         suba.l    a6,a0
  1556.         move.l    a0,d2
  1557.         lsr.l    #1,d2
  1558.         move.l    a3,d3
  1559.         rts
  1560.  
  1561. ; -------------------------------------------------------------------
  1562. ; Mixing routine: Mono, 16-bit, backwards, 68020+
  1563. ; -------------------------------------------------------------------
  1564.  
  1565. MIXb_mono16_020    movea.l    ci_sample_start(a5),a6
  1566.         move.l    d3,a3
  1567.         move.w    ci_volshift_l(a5),d3
  1568.         tst.w    d5
  1569.         beq.s    3$    ;advance zero
  1570.         lsr.w    #1,d0
  1571.         bcs.s    2$
  1572.         subq.w    #1,d0
  1573. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  1574.         asr.w    d3,d1    ;scale volume
  1575.         add.w    d1,(a2)+
  1576.         add.w    d6,d4    ;fraction += advfract
  1577.         subx.l    d5,d2    ;offset -= advance
  1578. 2$        move.w    0(a6,d2.l*2),d1
  1579.         asr.w    d3,d1
  1580.         add.w    d1,(a2)+
  1581.         add.w    d6,d4
  1582.         subx.l    d5,d2
  1583.         dbra    d0,1$
  1584.         move.l    a3,d3
  1585.         rts
  1586. 3$        lsr.w    #1,d0
  1587.         bcs.s    5$
  1588.         subq.w    #1,d0
  1589. 4$        move.w    0(a6,d2.l*2),d1
  1590.         asr.w    d3,d1
  1591. 6$        add.w    d1,(a2)+
  1592.         add.w    d6,d4
  1593.         bcc.s    7$
  1594.         subq.l    #1,d2
  1595. 5$        move.w    0(a6,d2.l*2),d1
  1596.         asr.w    d3,d1
  1597. 7$        add.w    d1,(a2)+
  1598.         add.w    d6,d4
  1599.         bcs.s    8$
  1600.         dbra    d0,6$
  1601.         move.l    a3,d3
  1602.         rts
  1603. 8$        subq.l    #1,d2
  1604.         dbra    d0,4$
  1605.         move.l    a3,d3
  1606.         rts
  1607.  
  1608. ; -------------------------------------------------------------------
  1609. ; Mixing routine: Mono, 8bit, forwards, 68020+
  1610. ; -------------------------------------------------------------------
  1611.  
  1612. MIX_mono8_020    movea.l    ci_sample_start(a5),a6
  1613.         movea.l    ci_voltable_l(a5),a3
  1614.         swap    d3    ;scratch the upper word of D3
  1615.         tst.w    d5
  1616.         beq.s    3$    ;advance zero
  1617.         lsr.w    #1,d0
  1618.         bcs.s    2$
  1619.         subq.w    #1,d0
  1620. 1$        move.b    0(a6,d2.l),d3    ;sample
  1621.         move.w    0(a3,d3.w*2),d1
  1622.         add.w    d1,(a2)+
  1623.         add.w    d6,d4    ;fraction += advfract
  1624.         addx.l    d5,d2    ;offset += advance
  1625. 2$        move.b    0(a6,d2.l),d3
  1626.         move.w    0(a3,d3.w*2),d1
  1627.         add.w    d1,(a2)+
  1628.         add.w    d6,d4
  1629.         addx.l    d5,d2
  1630.         dbra    d0,1$
  1631.         swap    d3
  1632.         rts
  1633. 3$        movea.l    a6,a0
  1634.         add.l    d2,a0
  1635.         lsr.w    #1,d0
  1636.         bcs.s    5$
  1637.         subq.w    #1,d0
  1638. 4$        move.b    (a0)+,d3
  1639.         move.w    0(a3,d3.w*2),d1
  1640. 6$        add.w    d1,(a2)+
  1641.         add.w    d6,d4
  1642.         bcc.s    7$
  1643. 5$        move.b    (a0)+,d3
  1644.         move.w    0(a3,d3.w*2),d1
  1645. 7$        add.w    d1,(a2)+
  1646.         add.w    d6,d4
  1647.         bcs.s    8$
  1648.         dbra    d0,6$
  1649.         suba.l    a6,a0
  1650.         move.l    a0,d2
  1651.         subq.l    #1,d2
  1652.         swap    d3
  1653.         rts
  1654. 8$        dbra    d0,4$
  1655.         suba.l    a6,a0
  1656.         move.l    a0,d2
  1657.         swap    d3
  1658.         rts
  1659.  
  1660. ; -------------------------------------------------------------------
  1661. ; Mixing routine: Mono, 8-bit, backwards, 68020+
  1662. ; -------------------------------------------------------------------
  1663.  
  1664. MIXb_mono8_020    movea.l    ci_sample_start(a5),a6
  1665.         movea.l    ci_voltable_l(a5),a3
  1666.         swap    d3
  1667.         tst.w    d5
  1668.         beq.s    3$    ;advance zero
  1669.         lsr.w    #1,d0
  1670.         bcs.s    2$
  1671.         subq.w    #1,d0
  1672. 1$        move.b    0(a6,d2.l),d3    ;sample
  1673.         move.w    0(a3,d3.w*2),d1
  1674.         add.w    d1,(a2)+
  1675.         add.w    d6,d4    ;fraction += advfract
  1676.         subx.l    d5,d2    ;offset += advance
  1677. 2$        move.b    0(a6,d2.l),d3
  1678.         move.w    0(a3,d3.w*2),d1
  1679.         add.w    d1,(a2)+
  1680.         add.w    d6,d4
  1681.         subx.l    d5,d2
  1682.         dbra    d0,1$
  1683.         swap    d3
  1684.         rts
  1685. 3$        lea    1(a6,d2.l),a0
  1686.         lsr.w    #1,d0
  1687.         bcs.s    5$
  1688.         subq.w    #1,d0
  1689. 4$        move.b    -(a0),d3
  1690.         move.w    0(a3,d3.w*2),d1
  1691. 6$        add.w    d1,(a2)+
  1692.         add.w    d6,d4
  1693.         bcc.s    7$
  1694. ;        subq.l    #1,d2
  1695. 5$        move.b    -(a0),d3
  1696.         move.w    0(a3,d3.w*2),d1
  1697. 7$        add.w    d1,(a2)+
  1698.         add.w    d6,d4
  1699.         bcs.s    8$
  1700.         dbra    d0,6$
  1701.         suba.l    a6,a0
  1702.         move.l    a0,d2
  1703.         swap    d3
  1704.         rts
  1705. 8$        dbra    d0,4$
  1706.         suba.l    a6,a0
  1707.         move.l    a0,d2
  1708.         subq.l    #1,d2
  1709.         swap    d3
  1710.         rts
  1711.     ENDC
  1712.  
  1713.     IFNE    SUPPORT_000
  1714. ; -------------------------------------------------------------------
  1715. ; Mixing routine: Stereo generic, 8-bit, forwards, 68000
  1716. ; -------------------------------------------------------------------
  1717.  
  1718. MIX_stereo8    movea.l    ci_sample_start(a5),a6
  1719.         movem.l    ci_voltable_l(a5),a0/a3
  1720.         swap    d7
  1721.         tst.w    d5
  1722.         beq.s    3$    ;advance zero
  1723.         lsr.w    #1,d0
  1724.         bcs.s    2$
  1725.         subq.w    #1,d0
  1726. 1$        moveq    #0,d1
  1727.         move.b    0(a6,d2.l),d1    ;sample
  1728.         add.w    d1,d1
  1729.         move.w    0(a0,d1.w),d7    ;left volume
  1730.         add.w    d7,(a2)+
  1731.         move.w    0(a3,d1.w),d7
  1732.         add.w    d7,(a2)+
  1733.         add.w    d6,d4    ;fraction += advfract
  1734.         addx.l    d5,d2    ;offset += advance
  1735. 2$        moveq    #0,d1
  1736.         move.b    0(a6,d2.l),d1
  1737.         add.w    d1,d1
  1738.         move.w    0(a0,d1.w),d7    ;left volume
  1739.         add.w    d7,(a2)+
  1740.         move.w    0(a3,d1.w),d7
  1741.         add.w    d7,(a2)+
  1742.         add.w    d6,d4
  1743.         addx.l    d5,d2
  1744.         dbra    d0,1$
  1745.         swap    d7
  1746.         rts
  1747. 3$        lsr.w    #1,d0
  1748.         bcs.s    5$
  1749.         subq.w    #1,d0
  1750. 4$        moveq    #0,d1
  1751.         move.b    0(a6,d2.l),d1
  1752.         add.w    d1,d1
  1753.         move.w    0(a0,d1.w),d7    ;left volume
  1754.         move.w    0(a3,d1.w),d1
  1755. 6$        add.w    d7,(a2)+
  1756.         add.w    d1,(a2)+
  1757.         add.w    d6,d4
  1758.         bcc.s    7$
  1759.         addq.l    #1,d2
  1760. 5$        moveq    #0,d1
  1761.         move.b    0(a6,d2.l),d1
  1762.         add.w    d1,d1
  1763.         move.w    0(a0,d1.w),d7
  1764.         move.w    0(a3,d1.w),d1
  1765. 7$        add.w    d7,(a2)+
  1766.         add.w    d1,(a2)+
  1767.         add.w    d6,d4
  1768.         bcs.s    8$
  1769.         dbra    d0,6$
  1770.         swap    d7
  1771.         rts
  1772. 8$        addq.l    #1,d2
  1773.         dbra    d0,4$
  1774.         swap    d7
  1775.         rts
  1776.  
  1777. ; -------------------------------------------------------------------
  1778. ; Mixing routine: Stereo left ch, 8-bit, forwards, 68000
  1779. ; -------------------------------------------------------------------
  1780.  
  1781. MIX_stereo8l    movea.l    ci_sample_start(a5),a6
  1782.         movea.l    ci_voltable_l(a5),a0
  1783.         tst.w    d5
  1784.         beq.s    3$    ;advance zero
  1785.         lsr.w    #1,d0
  1786.         bcs.s    2$
  1787.         subq.w    #1,d0
  1788. 1$        moveq    #0,d1
  1789.         move.b    0(a6,d2.l),d1    ;sample
  1790.         add.w    d1,d1
  1791.         move.w    0(a0,d1.w),d1    ;left volume
  1792.         add.w    d1,(a2)
  1793.         addq.l    #4,a2
  1794.         add.w    d6,d4    ;fraction += advfract
  1795.         addx.l    d5,d2    ;offset += advance
  1796. 2$        moveq    #0,d1
  1797.         move.b    0(a6,d2.l),d1
  1798.         add.w    d1,d1
  1799.         move.w    0(a0,d1.w),d1
  1800.         add.w    d1,(a2)
  1801.         addq.l    #4,a2
  1802.         add.w    d6,d4
  1803.         addx.l    d5,d2
  1804.         dbra    d0,1$
  1805.         rts
  1806. 3$        lsr.w    #1,d0
  1807.         bcs.s    5$
  1808.         subq.w    #1,d0
  1809. 4$        moveq    #0,d1
  1810.         move.b    0(a6,d2.l),d1
  1811.         add.w    d1,d1
  1812.         move.w    0(a0,d1.w),d1    ;left volume
  1813. 6$        add.w    d1,(a2)
  1814.         addq.l    #4,a2
  1815.         add.w    d6,d4
  1816.         bcc.s    7$
  1817.         addq.l    #1,d2
  1818. 5$        moveq    #0,d1
  1819.         move.b    0(a6,d2.l),d1
  1820.         add.w    d1,d1
  1821.         move.w    0(a0,d1.w),d1
  1822. 7$        add.w    d1,(a2)
  1823.         addq.l    #4,a2
  1824.         add.w    d6,d4
  1825.         bcs.s    8$
  1826.         dbra    d0,6$
  1827.         rts
  1828. 8$        addq.l    #1,d2
  1829.         dbra    d0,4$
  1830.         rts
  1831.  
  1832. ; -------------------------------------------------------------------
  1833. ; Mixing routine: Stereo right ch, 8-bit, forwards, 68000
  1834. ; -------------------------------------------------------------------
  1835.  
  1836. MIX_stereo8r    movea.l    ci_sample_start(a5),a6
  1837.         adda.l    ci_rightch_offs(a5),a6
  1838.         movea.l    ci_voltable_r(a5),a0
  1839.         tst.w    d5
  1840.         beq.s    3$    ;advance zero
  1841.         lsr.w    #1,d0
  1842.         bcs.s    2$
  1843.         subq.w    #1,d0
  1844. 1$        moveq    #0,d1
  1845.         move.b    0(a6,d2.l),d1    ;sample
  1846.         add.w    d1,d1
  1847.         move.w    0(a0,d1.w),d1    ;left volume
  1848.         addq.l    #2,a2
  1849.         add.w    d1,(a2)+
  1850.         add.w    d6,d4    ;fraction += advfract
  1851.         addx.l    d5,d2    ;offset += advance
  1852. 2$        moveq    #0,d1
  1853.         move.b    0(a6,d2.l),d1
  1854.         add.w    d1,d1
  1855.         move.w    0(a0,d1.w),d1
  1856.         addq.l    #2,a2
  1857.         add.w    d1,(a2)+
  1858.         add.w    d6,d4
  1859.         addx.l    d5,d2
  1860.         dbra    d0,1$
  1861.         rts
  1862. 3$        lsr.w    #1,d0
  1863.         bcs.s    5$
  1864.         subq.w    #1,d0
  1865. 4$        moveq    #0,d1
  1866.         move.b    0(a6,d2.l),d1
  1867.         add.w    d1,d1
  1868.         move.w    0(a0,d1.w),d1    ;left volume
  1869. 6$        addq.l    #2,a2
  1870.         add.w    d1,(a2)+
  1871.         add.w    d6,d4
  1872.         bcc.s    7$
  1873.         addq.l    #1,d2
  1874. 5$        moveq    #0,d1
  1875.         move.b    0(a6,d2.l),d1
  1876.         add.w    d1,d1
  1877.         move.w    0(a0,d1.w),d1
  1878. 7$        addq.l    #2,a2
  1879.         add.w    d1,(a2)+
  1880.         add.w    d6,d4
  1881.         bcs.s    8$
  1882.         dbra    d0,6$
  1883.         rts
  1884. 8$        addq.l    #1,d2
  1885.         dbra    d0,4$
  1886.         rts
  1887.  
  1888. ; -------------------------------------------------------------------
  1889. ; Mixing routine: Stereo centered, 8-bit, forwards, 68000
  1890. ; -------------------------------------------------------------------
  1891.  
  1892. MIX_stereo8c    movea.l    ci_sample_start(a5),a6
  1893.         movea.l    ci_voltable_l(a5),a0
  1894.         tst.w    d5
  1895.         beq.s    3$    ;advance zero
  1896.         lsr.w    #1,d0
  1897.         bcs.s    2$
  1898.         subq.w    #1,d0
  1899. 1$        moveq    #0,d1
  1900.         move.b    0(a6,d2.l),d1    ;sample
  1901.         add.w    d1,d1
  1902.         move.w    0(a0,d1.w),d1    ;left volume
  1903.         add.w    d1,(a2)+
  1904.         add.w    d1,(a2)+
  1905.         add.w    d6,d4    ;fraction += advfract
  1906.         addx.l    d5,d2    ;offset += advance
  1907. 2$        moveq    #0,d1
  1908.         move.b    0(a6,d2.l),d1
  1909.         add.w    d1,d1
  1910.         move.w    0(a0,d1.w),d1
  1911.         add.w    d1,(a2)+
  1912.         add.w    d1,(a2)+
  1913.         add.w    d6,d4
  1914.         addx.l    d5,d2
  1915.         dbra    d0,1$
  1916.         rts
  1917. 3$        lsr.w    #1,d0
  1918.         bcs.s    5$
  1919.         subq.w    #1,d0
  1920. 4$        moveq    #0,d1
  1921.         move.b    0(a6,d2.l),d1
  1922.         add.w    d1,d1
  1923.         move.w    0(a0,d1.w),d1    ;left volume
  1924. 6$        add.w    d1,(a2)+
  1925.         add.w    d1,(a2)+
  1926.         add.w    d6,d4
  1927.         bcc.s    7$
  1928.         addq.l    #1,d2
  1929. 5$        moveq    #0,d1
  1930.         move.b    0(a6,d2.l),d1
  1931.         add.w    d1,d1
  1932.         move.w    0(a0,d1.w),d1
  1933. 7$        add.w    d1,(a2)+
  1934.         add.w    d1,(a2)+
  1935.         add.w    d6,d4
  1936.         bcs.s    8$
  1937.         dbra    d0,6$
  1938.         rts
  1939. 8$        addq.l    #1,d2
  1940.         dbra    d0,4$
  1941.         rts
  1942.  
  1943. ; -------------------------------------------------------------------
  1944. ; Mixing routine: Stereo two-channel, 8-bit, forwards, 68000
  1945. ; -------------------------------------------------------------------
  1946.  
  1947. MIX_stereo8s    movem.l    d7/a4,-(sp)
  1948.         move.l    ci_sample_start(a5),a0
  1949.         move.l    a0,a6
  1950.         adda.l    ci_rightch_offs(a5),a6
  1951.         movem.l    ci_voltable_l(a5),a3/a4
  1952.         tst.w    d5
  1953.         beq.s    3$    ;advance zero
  1954.         lsr.w    #1,d0
  1955.         bcs.s    2$
  1956.         subq.w    #1,d0
  1957. 1$        moveq    #0,d1
  1958.         move.b    0(a0,d2.l),d1    ;sample (left)
  1959.         add.w    d1,d1
  1960.         move.w    0(a3,d1.w),d1    ;left volume
  1961.         add.w    d1,(a2)+
  1962.         moveq    #0,d7
  1963.         move.b    0(a6,d2.l),d7    ;sample (right)
  1964.         add.w    d7,d7
  1965.         move.w    0(a4,d7.w),d7
  1966.         add.w    d7,(a2)+
  1967.         add.w    d6,d4    ;fraction += advfract
  1968.         addx.l    d5,d2    ;offset += advance
  1969. 2$        moveq    #0,d1
  1970.         move.b    0(a0,d2.l),d1    ;sample (left)
  1971.         add.w    d1,d1
  1972.         move.w    0(a3,d1.w),d1    ;left volume
  1973.         add.w    d1,(a2)+
  1974.         moveq    #0,d7
  1975.         move.b    0(a6,d2.l),d7    ;sample (right)
  1976.         add.w    d7,d7
  1977.         move.w    0(a4,d7.w),d7
  1978.         add.w    d7,(a2)+
  1979.         add.w    d6,d4
  1980.         addx.l    d5,d2
  1981.         dbra    d0,1$
  1982.         movem.l    (sp)+,d7/a4
  1983.         rts
  1984. 3$        lsr.w    #1,d0
  1985.         bcs.s    5$
  1986.         subq.w    #1,d0
  1987. 4$        moveq    #0,d1
  1988.         move.b    0(a0,d2.l),d1    ;sample (left)
  1989.         add.w    d1,d1
  1990.         move.w    0(a3,d1.w),d1    ;left volume
  1991.         moveq    #0,d7
  1992.         move.b    0(a6,d2.l),d7    ;sample (right)
  1993.         add.w    d7,d7
  1994.         move.w    0(a4,d7.w),d7
  1995. 6$        add.w    d1,(a2)+
  1996.         add.w    d7,(a2)+
  1997.         add.w    d6,d4
  1998.         bcc.s    7$
  1999.         addq.l    #1,d2
  2000. 5$        moveq    #0,d1
  2001.         move.b    0(a0,d2.l),d1    ;sample (left)
  2002.         add.w    d1,d1
  2003.         move.w    0(a3,d1.w),d1    ;left volume
  2004.         moveq    #0,d7
  2005.         move.b    0(a6,d2.l),d7    ;sample (right)
  2006.         add.w    d7,d7
  2007.         move.w    0(a4,d7.w),d7
  2008. 7$        add.w    d1,(a2)+
  2009.         add.w    d7,(a2)+
  2010.         add.w    d6,d4
  2011.         bcs.s    8$
  2012.         dbra    d0,6$
  2013.         movem.l    (sp)+,d7/a4
  2014.         rts
  2015. 8$        addq.l    #1,d2
  2016.         dbra    d0,4$
  2017.         movem.l    (sp)+,d7/a4
  2018.         rts
  2019.  
  2020. ; -------------------------------------------------------------------
  2021. ; Mixing routine: Stereo, 8-bit, backwards, 68000
  2022. ; -------------------------------------------------------------------
  2023.  
  2024. MIXb_stereo8    movea.l    ci_sample_start(a5),a6
  2025.         movem.l    ci_voltable_l(a5),a0/a3
  2026.         move.w    d7,-(sp)
  2027.         tst.w    d5
  2028.         beq.s    3$    ;advance zero
  2029.         lsr.w    #1,d0
  2030.         bcs.s    2$
  2031.         subq.w    #1,d0
  2032. 1$        moveq    #0,d1
  2033.         move.b    0(a6,d2.l),d1    ;sample
  2034.         add.w    d1,d1
  2035.         move.w    0(a0,d1.w),d7    ;left volume
  2036.         add.w    d7,(a2)+
  2037.         move.w    0(a3,d1.w),d7
  2038.         add.w    d7,(a2)+
  2039.         add.w    d6,d4    ;fraction += advfract
  2040.         subx.l    d5,d2    ;offset += advance
  2041. 2$        moveq    #0,d1
  2042.         move.b    0(a6,d2.l),d1
  2043.         add.w    d1,d1
  2044.         move.w    0(a0,d1.w),d7    ;left volume
  2045.         add.w    d7,(a2)+
  2046.         move.w    0(a3,d1.w),d7
  2047.         add.w    d7,(a2)+
  2048.         add.w    d6,d4
  2049.         subx.l    d5,d2
  2050.         dbra    d0,1$
  2051.         move.w    (sp)+,d7
  2052.         rts
  2053. 3$        lsr.w    #1,d0
  2054.         bcs.s    5$
  2055.         subq.w    #1,d0
  2056. 4$        moveq    #0,d1
  2057.         move.b    0(a6,d2.l),d1
  2058.         add.w    d1,d1
  2059.         move.w    0(a0,d1.w),d7    ;left volume
  2060.         move.w    0(a3,d1.w),d1
  2061. 6$        add.w    d7,(a2)+
  2062.         add.w    d1,(a2)+
  2063.         add.w    d6,d4
  2064.         bcc.s    7$
  2065.         subq.l    #1,d2
  2066. 5$        moveq    #0,d1
  2067.         move.b    0(a6,d2.l),d1
  2068.         add.w    d1,d1
  2069.         move.w    0(a0,d1.w),d7
  2070.         move.w    0(a3,d1.w),d1
  2071. 7$        add.w    d7,(a2)+
  2072.         add.w    d1,(a2)+
  2073.         add.w    d6,d4
  2074.         bcs.s    8$
  2075.         dbra    d0,6$
  2076.         move.w    (sp)+,d7
  2077.         rts
  2078. 8$        subq.l    #1,d2
  2079.         dbra    d0,4$
  2080.         move.w    (sp)+,d7
  2081.         rts
  2082.  
  2083. ; -------------------------------------------------------------------
  2084. ; Mixing routine: Stereo left ch, 8-bit, backwards, 68000
  2085. ; -------------------------------------------------------------------
  2086.  
  2087. MIXb_stereo8l    movea.l    ci_sample_start(a5),a6
  2088.         movea.l    ci_voltable_l(a5),a0
  2089.         tst.w    d5
  2090.         beq.s    3$    ;advance zero
  2091.         lsr.w    #1,d0
  2092.         bcs.s    2$
  2093.         subq.w    #1,d0
  2094. 1$        moveq    #0,d1
  2095.         move.b    0(a6,d2.l),d1    ;sample
  2096.         add.w    d1,d1
  2097.         move.w    0(a0,d1.w),d1    ;left volume
  2098.         add.w    d1,(a2)
  2099.         addq.l    #4,a2
  2100.         add.w    d6,d4    ;fraction += advfract
  2101.         subx.l    d5,d2    ;offset += advance
  2102. 2$        moveq    #0,d1
  2103.         move.b    0(a6,d2.l),d1
  2104.         add.w    d1,d1
  2105.         move.w    0(a0,d1.w),d1
  2106.         add.w    d1,(a2)
  2107.         addq.l    #4,a2
  2108.         add.w    d6,d4
  2109.         subx.l    d5,d2
  2110.         dbra    d0,1$
  2111.         rts
  2112. 3$        lsr.w    #1,d0
  2113.         bcs.s    5$
  2114.         subq.w    #1,d0
  2115. 4$        moveq    #0,d1
  2116.         move.b    0(a6,d2.l),d1
  2117.         add.w    d1,d1
  2118.         move.w    0(a0,d1.w),d1    ;left volume
  2119. 6$        add.w    d1,(a2)
  2120.         addq.l    #4,a2
  2121.         add.w    d6,d4
  2122.         bcc.s    7$
  2123.         subq.l    #1,d2
  2124. 5$        moveq    #0,d1
  2125.         move.b    0(a6,d2.l),d1
  2126.         add.w    d1,d1
  2127.         move.w    0(a0,d1.w),d1
  2128. 7$        add.w    d1,(a2)
  2129.         addq.l    #4,a2
  2130.         add.w    d6,d4
  2131.         bcs.s    8$
  2132.         dbra    d0,6$
  2133.         rts
  2134. 8$        subq.l    #1,d2
  2135.         dbra    d0,4$
  2136.         rts
  2137.  
  2138. ; -------------------------------------------------------------------
  2139. ; Mixing routine: Stereo right ch, 8-bit, backwards, 68000
  2140. ; -------------------------------------------------------------------
  2141.  
  2142. MIXb_stereo8r    movea.l    ci_sample_start(a5),a6
  2143.         adda.l    ci_rightch_offs(a5),a6
  2144.         movea.l    ci_voltable_r(a5),a0
  2145.         tst.w    d5
  2146.         beq.s    3$    ;advance zero
  2147.         lsr.w    #1,d0
  2148.         bcs.s    2$
  2149.         subq.w    #1,d0
  2150. 1$        moveq    #0,d1
  2151.         move.b    0(a6,d2.l),d1    ;sample
  2152.         add.w    d1,d1
  2153.         move.w    0(a0,d1.w),d1    ;left volume
  2154.         addq.l    #2,a2
  2155.         add.w    d1,(a2)+
  2156.         add.w    d6,d4    ;fraction += advfract
  2157.         subx.l    d5,d2    ;offset += advance
  2158. 2$        moveq    #0,d1
  2159.         move.b    0(a6,d2.l),d1
  2160.         add.w    d1,d1
  2161.         move.w    0(a0,d1.w),d1
  2162.         addq.l    #2,a2
  2163.         add.w    d1,(a2)+
  2164.         add.w    d6,d4
  2165.         subx.l    d5,d2
  2166.         dbra    d0,1$
  2167.         rts
  2168. 3$        lsr.w    #1,d0
  2169.         bcs.s    5$
  2170.         subq.w    #1,d0
  2171. 4$        moveq    #0,d1
  2172.         move.b    0(a6,d2.l),d1
  2173.         add.w    d1,d1
  2174.         move.w    0(a0,d1.w),d1    ;left volume
  2175. 6$        addq.l    #2,a2
  2176.         add.w    d1,(a2)+
  2177.         add.w    d6,d4
  2178.         bcc.s    7$
  2179.         subq.l    #1,d2
  2180. 5$        moveq    #0,d1
  2181.         move.b    0(a6,d2.l),d1
  2182.         add.w    d1,d1
  2183.         move.w    0(a0,d1.w),d1
  2184. 7$        addq.l    #2,a2
  2185.         add.w    d1,(a2)+
  2186.         add.w    d6,d4
  2187.         bcs.s    8$
  2188.         dbra    d0,6$
  2189.         rts
  2190. 8$        subq.l    #1,d2
  2191.         dbra    d0,4$
  2192.         rts
  2193.  
  2194. ; -------------------------------------------------------------------
  2195. ; Mixing routine: Stereo centered, 8-bit, backwards, 68000
  2196. ; -------------------------------------------------------------------
  2197.  
  2198. MIXb_stereo8c    movea.l    ci_sample_start(a5),a6
  2199.         movea.l    ci_voltable_l(a5),a0
  2200.         tst.w    d5
  2201.         beq.s    3$    ;advance zero
  2202.         lsr.w    #1,d0
  2203.         bcs.s    2$
  2204.         subq.w    #1,d0
  2205. 1$        moveq    #0,d1
  2206.         move.b    0(a6,d2.l),d1    ;sample
  2207.         add.w    d1,d1
  2208.         move.w    0(a0,d1.w),d1    ;left volume
  2209.         add.w    d1,(a2)+
  2210.         add.w    d1,(a2)+
  2211.         add.w    d6,d4    ;fraction += advfract
  2212.         subx.l    d5,d2    ;offset += advance
  2213. 2$        moveq    #0,d1
  2214.         move.b    0(a6,d2.l),d1
  2215.         add.w    d1,d1
  2216.         move.w    0(a0,d1.w),d1
  2217.         add.w    d1,(a2)+
  2218.         add.w    d1,(a2)+
  2219.         add.w    d6,d4
  2220.         subx.l    d5,d2
  2221.         dbra    d0,1$
  2222.         rts
  2223. 3$        lsr.w    #1,d0
  2224.         bcs.s    5$
  2225.         subq.w    #1,d0
  2226. 4$        moveq    #0,d1
  2227.         move.b    0(a6,d2.l),d1
  2228.         add.w    d1,d1
  2229.         move.w    0(a0,d1.w),d1    ;left volume
  2230. 6$        add.w    d1,(a2)+
  2231.         add.w    d1,(a2)+
  2232.         add.w    d6,d4
  2233.         bcc.s    7$
  2234.         subq.l    #1,d2
  2235. 5$        moveq    #0,d1
  2236.         move.b    0(a6,d2.l),d1
  2237.         add.w    d1,d1
  2238.         move.w    0(a0,d1.w),d1
  2239. 7$        add.w    d1,(a2)+
  2240.         add.w    d1,(a2)+
  2241.         add.w    d6,d4
  2242.         bcs.s    8$
  2243.         dbra    d0,6$
  2244.         rts
  2245. 8$        subq.l    #1,d2
  2246.         dbra    d0,4$
  2247.         rts
  2248.  
  2249. ; -------------------------------------------------------------------
  2250. ; Mixing routine: Stereo two-channel, 8-bit, backwards, 68000
  2251. ; -------------------------------------------------------------------
  2252.  
  2253. MIXb_stereo8s    movem.l    d7/a4,-(sp)
  2254.         movea.l    ci_sample_start(a5),a0
  2255.         move.l    a0,a6
  2256.         adda.l    ci_rightch_offs(a5),a6
  2257.         movem.l    ci_voltable_l(a5),a3/a4
  2258.         tst.w    d5
  2259.         beq.s    3$    ;advance zero
  2260.         lsr.w    #1,d0
  2261.         bcs.s    2$
  2262.         subq.w    #1,d0
  2263. 1$        moveq    #0,d1
  2264.         move.b    0(a0,d2.l),d1    ;sample (left)
  2265.         add.w    d1,d1
  2266.         move.w    0(a3,d1.w),d1    ;left volume
  2267.         add.w    d1,(a2)+
  2268.         moveq    #0,d7
  2269.         move.b    0(a6,d2.l),d7    ;sample (right)
  2270.         add.w    d7,d7
  2271.         move.w    0(a4,d7.w),d7
  2272.         add.w    d7,(a2)+
  2273.         add.w    d6,d4    ;fraction += advfract
  2274.         subx.l    d5,d2    ;offset += advance
  2275. 2$        moveq    #0,d1
  2276.         move.b    0(a6,d2.l),d1    ;sample (left)
  2277.         add.w    d1,d1
  2278.         move.w    0(a3,d1.w),d1    ;left volume
  2279.         add.w    d1,(a2)+
  2280.         moveq    #0,d7
  2281.         move.b    0(a6,d2.l),d7    ;sample (right)
  2282.         add.w    d7,d7
  2283.         move.w    0(a4,d7.w),d7
  2284.         add.w    d7,(a2)+
  2285.         add.w    d6,d4
  2286.         subx.l    d5,d2
  2287.         dbra    d0,1$
  2288.         movem.l    (sp)+,d7/a4
  2289.         rts
  2290. 3$        lsr.w    #1,d0
  2291.         bcs.s    5$
  2292.         subq.w    #1,d0
  2293. 4$        moveq    #0,d1
  2294.         move.b    0(a0,d2.l),d1    ;sample (left)
  2295.         add.w    d1,d1
  2296.         move.w    0(a3,d1.w),d1    ;left volume
  2297.         moveq    #0,d7
  2298.         move.b    0(a6,d2.l),d7    ;sample (right)
  2299.         add.w    d7,d7
  2300.         move.w    0(a4,d7.w),d7
  2301. 6$        add.w    d1,(a2)+
  2302.         add.w    d7,(a2)+
  2303.         add.w    d6,d4
  2304.         bcc.s    7$
  2305.         subq.l    #1,d2
  2306. 5$        moveq    #0,d1
  2307.         move.b    0(a0,d2.l),d1    ;sample (left)
  2308.         add.w    d1,d1
  2309.         move.w    0(a3,d1.w),d1    ;left volume
  2310.         moveq    #0,d7
  2311.         move.b    0(a6,d2.l),d7    ;sample (right)
  2312.         add.w    d7,d7
  2313.         move.w    0(a4,d7.w),d7
  2314. 7$        add.w    d1,(a2)+
  2315.         add.w    d7,(a2)+
  2316.         add.w    d6,d4
  2317.         bcs.s    8$
  2318.         dbra    d0,6$
  2319.         movem.l    (sp)+,d7/a4
  2320.         rts
  2321. 8$        subq.l    #1,d2
  2322.         dbra    d0,4$
  2323.         movem.l    (sp)+,d7/a4
  2324.         rts
  2325.  
  2326. ; -------------------------------------------------------------------
  2327. ; Mixing routine: Stereo two-channel, 16-bit, forwards, 68000
  2328. ; -------------------------------------------------------------------
  2329.  
  2330. ; (No alternative version here... out of registers.)
  2331.  
  2332. MIX_stereo16s    move.l    ci_sample_start(a5),a0
  2333.         movea.l    a0,a6
  2334.         adda.l    ci_rightch_offs(a5),a6
  2335.         swap    d3
  2336.         swap    d7
  2337.         move.w    ci_volshift_l(a5),d3
  2338.         move.w    ci_volshift_r(a5),d7
  2339.         lsr.w    #1,d0
  2340.         bcs.s    2$
  2341.         subq.w    #1,d0
  2342. 1$        move.l    d2,a3
  2343.         add.l    a3,a3    ;offset * 2
  2344.         move.w    0(a0,a3.l),d1    ;sample (L)
  2345.         asr.w    d3,d1    ;scale vol (L)
  2346.         add.w    d1,(a2)+
  2347.         move.w    0(a6,a3.l),d1
  2348.         asr.w    d7,d1    ;scale vol (R)
  2349.         add.w    d1,(a2)+
  2350.         add.w    d6,d4    ;fraction += advfract
  2351.         addx.l    d5,d2    ;offset += advance
  2352. 2$        move.l    d2,a3
  2353.         add.l    a3,a3    ;offset * 2
  2354.         move.w    0(a0,a3.l),d1    ;sample (L)
  2355.         asr.w    d3,d1    ;scale vol (L)
  2356.         add.w    d1,(a2)+
  2357.         move.w    0(a6,a3.l),d1
  2358.         asr.w    d7,d1    ;scale vol (R)
  2359.         add.w    d1,(a2)+
  2360.         add.w    d6,d4    ;fraction += advfract
  2361.         addx.l    d5,d2    ;offset += advance
  2362.         dbra    d0,1$
  2363.         swap    d3
  2364.         swap    d7
  2365.         rts
  2366.  
  2367. ; -------------------------------------------------------------------
  2368. ; Mixing routine: Stereo left ch, 16-bit, forwards, 68000
  2369. ; -------------------------------------------------------------------
  2370.  
  2371. MIX_stereo16l    movea.l    ci_sample_start(a5),a6
  2372.         move.l    d3,a3    ;store
  2373.         move.w    ci_volshift_l(a5),d3
  2374.         tst.w    d5
  2375.         beq.s    3$
  2376.         lsr.w    #1,d0
  2377.         bcs.s    2$
  2378.         subq.w    #1,d0
  2379. 1$        move.l    d2,d1
  2380.         add.l    d1,d1    ;offset * 2
  2381.         move.w    0(a6,d1.l),d1    ;sample
  2382.         asr.w    d3,d1    ;scale volume
  2383.         add.w    d1,(a2)+
  2384.         addq.l    #2,a2
  2385.         add.w    d6,d4    ;fraction += advfract
  2386.         addx.l    d5,d2    ;offset += advance
  2387. 2$        move.l    d2,d1
  2388.         add.l    d1,d1    ;offset * 2
  2389.         move.w    0(a6,d1.l),d1    ;sample
  2390.         asr.w    d3,d1    ;scale volume
  2391.         add.w    d1,(a2)+
  2392.         addq.l    #2,a2
  2393.         add.w    d6,d4    ;fraction += advfract
  2394.         addx.l    d5,d2    ;offset += advance
  2395.         dbra    d0,1$
  2396.         move.l    a3,d3
  2397.         rts
  2398. 3$        add.l    d2,d2
  2399.         lsr.w    #1,d0
  2400.         bcs.s    5$
  2401.         subq.w    #1,d0
  2402. 4$        move.w    0(a6,d2.l),d1    ;sample
  2403.         asr.w    d3,d1    ;scale volume
  2404. 6$        add.w    d1,(a2)+
  2405.         addq.l    #2,a2
  2406.         add.w    d6,d4    ;fraction += advfract
  2407.         bcc.s    7$
  2408.         addq.l    #2,d2
  2409. 5$        move.w    0(a6,d2.l),d1    ;sample
  2410.         asr.w    d3,d1    ;scale volume
  2411. 7$        add.w    d1,(a2)+
  2412.         addq.l    #2,a2
  2413.         add.w    d6,d4    ;fraction += advfract
  2414.         bcs.s    8$
  2415.         dbra    d0,6$
  2416.         lsr.l    #1,d2
  2417.         move.l    a3,d3
  2418.         rts
  2419. 8$        addq.l    #2,d2
  2420.         dbra    d0,4$
  2421.         lsr.l    #1,d2
  2422.         move.l    a3,d3
  2423.         rts
  2424.  
  2425. ; -------------------------------------------------------------------
  2426. ; Mixing routine: Stereo right ch, 16-bit, forwards, 68000
  2427. ; -------------------------------------------------------------------
  2428.  
  2429. MIX_stereo16r    movea.l    ci_sample_start(a5),a6
  2430.         adda.l    ci_rightch_offs(a5),a6
  2431.         move.l    d3,a3    ;store
  2432.         move.w    ci_volshift_r(a5),d3
  2433.         tst.w    d5
  2434.         beq.s    3$
  2435.         lsr.w    #1,d0
  2436.         bcs.s    2$
  2437.         subq.w    #1,d0
  2438. 1$        move.l    d2,d1
  2439.         add.l    d1,d1    ;offset * 2
  2440.         move.w    0(a6,d1.l),d1    ;sample
  2441.         asr.w    d3,d1    ;scale volume
  2442.         addq.l    #2,a2
  2443.         add.w    d1,(a2)+
  2444.         add.w    d6,d4    ;fraction += advfract
  2445.         addx.l    d5,d2    ;offset += advance
  2446. 2$        move.l    d2,d1
  2447.         add.l    d1,d1    ;offset * 2
  2448.         move.w    0(a6,d1.l),d1    ;sample
  2449.         asr.w    d3,d1    ;scale volume
  2450.         addq.l    #2,a2
  2451.         add.w    d1,(a2)+
  2452.         add.w    d6,d4    ;fraction += advfract
  2453.         addx.l    d5,d2    ;offset += advance
  2454.         dbra    d0,1$
  2455.         move.l    a3,d3
  2456.         rts
  2457. 3$        add.l    d2,d2
  2458.         lsr.w    #1,d0
  2459.         bcs.s    5$
  2460.         subq.w    #1,d0
  2461. 4$        move.w    0(a6,d2.l),d1    ;sample
  2462.         asr.w    d3,d1    ;scale volume
  2463. 6$        addq.l    #2,a2
  2464.         add.w    d1,(a2)+
  2465.         add.w    d6,d4    ;fraction += advfract
  2466.         bcc.s    7$
  2467.         addq.l    #2,d2
  2468. 5$        move.w    0(a6,d2.l),d1    ;sample
  2469.         asr.w    d3,d1    ;scale volume
  2470. 7$        addq.l    #2,a2
  2471.         add.w    d1,(a2)+
  2472.         add.w    d6,d4    ;fraction += advfract
  2473.         bcs.s    8$
  2474.         dbra    d0,6$
  2475.         lsr.l    #1,d2
  2476.         move.l    a3,d3
  2477.         rts
  2478. 8$        addq.l    #2,d2
  2479.         dbra    d0,4$
  2480.         lsr.l    #1,d2
  2481.         move.l    a3,d3
  2482.         rts
  2483.  
  2484. ; -------------------------------------------------------------------
  2485. ; Mixing routine: Stereo centered, 16-bit, forwards, 68000
  2486. ; -------------------------------------------------------------------
  2487.  
  2488. MIX_stereo16c    movea.l    ci_sample_start(a5),a6
  2489.         move.l    d3,a3    ;store
  2490.         move.w    ci_volshift_l(a5),d3
  2491.         tst.w    d5
  2492.         beq.s    3$
  2493.         lsr.w    #1,d0
  2494.         bcs.s    2$
  2495.         subq.w    #1,d0
  2496. 1$        move.l    d2,d1
  2497.         add.l    d1,d1    ;offset * 2
  2498.         move.w    0(a6,d1.l),d1    ;sample
  2499.         asr.w    d3,d1    ;scale volume
  2500.         add.w    d1,(a2)+
  2501.         add.w    d1,(a2)+
  2502.         add.w    d6,d4    ;fraction += advfract
  2503.         addx.l    d5,d2    ;offset += advance
  2504. 2$        move.l    d2,d1
  2505.         add.l    d1,d1    ;offset * 2
  2506.         move.w    0(a6,d1.l),d1    ;sample
  2507.         asr.w    d3,d1    ;scale volume
  2508.         add.w    d1,(a2)+
  2509.         add.w    d1,(a2)+
  2510.         add.w    d6,d4    ;fraction += advfract
  2511.         addx.l    d5,d2    ;offset += advance
  2512.         dbra    d0,1$
  2513.         move.l    a3,d3
  2514.         rts
  2515. 3$        add.l    d2,d2
  2516.         lsr.w    #1,d0
  2517.         bcs.s    5$
  2518.         subq.w    #1,d0
  2519. 4$        move.w    0(a6,d2.l),d1    ;sample
  2520.         asr.w    d3,d1    ;scale volume
  2521. 6$        add.w    d1,(a2)+
  2522.         add.w    d1,(a2)+
  2523.         add.w    d6,d4    ;fraction += advfract
  2524.         bcc.s    7$
  2525.         addq.l    #2,d2
  2526. 5$        move.w    0(a6,d2.l),d1    ;sample
  2527.         asr.w    d3,d1    ;scale volume
  2528. 7$        add.w    d1,(a2)+
  2529.         add.w    d1,(a2)+
  2530.         add.w    d6,d4    ;fraction += advfract
  2531.         bcs.s    8$
  2532.         dbra    d0,6$
  2533.         lsr.l    #1,d2
  2534.         move.l    a3,d3
  2535.         rts
  2536. 8$        addq.l    #2,d2
  2537.         dbra    d0,4$
  2538.         lsr.l    #1,d2
  2539.         move.l    a3,d3
  2540.         rts
  2541.  
  2542. ; -------------------------------------------------------------------
  2543. ; Mixing routine: Stereo generic, 16-bit, forwards, 68000
  2544. ; -------------------------------------------------------------------
  2545.  
  2546. MIX_stereo16    movea.l    ci_sample_start(a5),a6
  2547.         swap    d3    ;upper words are free for scratch
  2548.         swap    d7    ;use
  2549.         move.w    d6,a3
  2550.         move.w    ci_volshift_l(a5),d3
  2551.         move.w    ci_volshift_r(a5),d7
  2552.         tst.w    d5
  2553.         beq.s    3$
  2554.         lsr.w    #1,d0
  2555.         bcs.s    2$
  2556.         subq.w    #1,d0
  2557. 1$        move.l    d2,d1
  2558.         add.l    d1,d1    ;offset * 2
  2559.         move.w    0(a6,d1.l),d1    ;sample
  2560.         move.w    d1,d6
  2561.         asr.w    d3,d1    ;scale volume
  2562.         add.w    d1,(a2)+
  2563.         asr.w    d7,d6
  2564.         add.w    d6,(a2)+
  2565.         add.w    a3,d4    ;fraction += advfract
  2566.         addx.l    d5,d2    ;offset += advance
  2567. 2$        move.l    d2,d1
  2568.         add.l    d1,d1    ;offset * 2
  2569.         move.w    0(a6,d1.l),d1    ;sample
  2570.         move.w    d1,d6
  2571.         asr.w    d3,d1    ;scale volume
  2572.         add.w    d1,(a2)+
  2573.         asr.w    d7,d6
  2574.         add.w    d6,(a2)+
  2575.         add.w    a3,d4
  2576.         addx.l    d5,d2
  2577.         dbra    d0,1$
  2578.         move.l    a3,d6
  2579.         swap    d3
  2580.         swap    d7
  2581.         rts
  2582. 3$        add.l    d2,d2
  2583.         lsr.w    #1,d0
  2584.         bcs.s    5$
  2585.         subq.w    #1,d0
  2586. 4$        move.w    0(a6,d2.l),d1    ;sample
  2587.         move.w    d1,d6
  2588.         asr.w    d3,d1
  2589.         asr.w    d7,d6
  2590. 6$        add.w    d1,(a2)+
  2591.         add.w    d6,(a2)+
  2592.         add.w    a3,d4    ;fraction += advfract
  2593.         bcc.s    7$
  2594.         addq.l    #2,d2
  2595. 5$        move.w    0(a6,d2.l),d1    ;sample
  2596.         move.w    d1,d6
  2597.         asr.w    d3,d1    ;scale volume
  2598.         asr.w    d7,d6
  2599. 7$        add.w    d1,(a2)+
  2600.         add.w    d6,(a2)+
  2601.         add.w    a3,d4    ;fraction += advfract
  2602.         bcs.s    8$
  2603.         dbra    d0,6$
  2604.         lsr.l    #1,d2
  2605.         move.l    a3,d6
  2606.         swap    d3
  2607.         swap    d7
  2608.         rts
  2609. 8$        addq.l    #2,d2
  2610.         dbra    d0,4$
  2611.         lsr.l    #1,d2
  2612.         move.l    a3,d6
  2613.         swap    d3
  2614.         swap    d7
  2615.         rts
  2616.  
  2617. ; -------------------------------------------------------------------
  2618. ; Mixing routine: Stereo two-channel, 16-bit, backwards, 68000
  2619. ; -------------------------------------------------------------------
  2620.  
  2621. MIXb_stereo16s    move.l    ci_sample_start(a5),a0
  2622.         movea.l    a0,a6
  2623.         adda.l    ci_rightch_offs(a5),a6
  2624.         swap    d3
  2625.         swap    d7
  2626.         move.w    ci_volshift_l(a5),d3
  2627.         move.w    ci_volshift_r(a5),d7
  2628.         lsr.w    #1,d0
  2629.         bcs.s    2$
  2630.         subq.w    #1,d0
  2631. 1$        move.l    d2,a3
  2632.         add.l    a3,a3    ;offset * 2
  2633.         move.w    0(a0,a3.l),d1    ;sample (L)
  2634.         asr.w    d3,d1    ;scale vol (L)
  2635.         add.w    d1,(a2)+
  2636.         move.w    0(a6,a3.l),d1
  2637.         asr.w    d7,d1    ;scale vol (R)
  2638.         add.w    d1,(a2)+
  2639.         add.w    d6,d4    ;fraction += advfract
  2640.         subx.l    d5,d2    ;offset += advance
  2641. 2$        move.l    d2,a3
  2642.         add.l    a3,a3    ;offset * 2
  2643.         move.w    0(a0,a3.l),d1    ;sample (L)
  2644.         asr.w    d3,d1    ;scale vol (L)
  2645.         add.w    d1,(a2)+
  2646.         move.w    0(a6,a3.l),d1
  2647.         asr.w    d7,d1    ;scale vol (R)
  2648.         add.w    d1,(a2)+
  2649.         add.w    d6,d4    ;fraction += advfract
  2650.         subx.l    d5,d2    ;offset += advance
  2651.         dbra    d0,1$
  2652.         swap    d3
  2653.         swap    d7
  2654.         rts
  2655.  
  2656. ; -------------------------------------------------------------------
  2657. ; Mixing routine: Stereo left ch, 16-bit, backwards, 68000
  2658. ; -------------------------------------------------------------------
  2659.  
  2660. MIXb_stereo16l    movea.l    ci_sample_start(a5),a6
  2661.         move.l    d3,a3    ;store
  2662.         move.w    ci_volshift_l(a5),d3
  2663.         tst.w    d5
  2664.         beq.s    3$
  2665.         lsr.w    #1,d0
  2666.         bcs.s    2$
  2667.         subq.w    #1,d0
  2668. 1$        move.l    d2,d1
  2669.         add.l    d1,d1    ;offset * 2
  2670.         move.w    0(a6,d1.l),d1    ;sample
  2671.         asr.w    d3,d1    ;scale volume
  2672.         add.w    d1,(a2)+
  2673.         addq.l    #2,a2
  2674.         add.w    d6,d4    ;fraction += advfract
  2675.         subx.l    d5,d2    ;offset += advance
  2676. 2$        move.l    d2,d1
  2677.         add.l    d1,d1    ;offset * 2
  2678.         move.w    0(a6,d1.l),d1    ;sample
  2679.         asr.w    d3,d1    ;scale volume
  2680.         add.w    d1,(a2)+
  2681.         addq.l    #2,a2
  2682.         add.w    d6,d4    ;fraction += advfract
  2683.         subx.l    d5,d2    ;offset += advance
  2684.         dbra    d0,1$
  2685.         move.l    a3,d3
  2686.         rts
  2687. 3$        add.l    d2,d2
  2688.         lsr.w    #1,d0
  2689.         bcs.s    5$
  2690.         subq.w    #1,d0
  2691. 4$        move.w    0(a6,d2.l),d1    ;sample
  2692.         asr.w    d3,d1    ;scale volume
  2693. 6$        add.w    d1,(a2)+
  2694.         addq.l    #2,a2
  2695.         add.w    d6,d4    ;fraction += advfract
  2696.         bcc.s    7$
  2697.         subq.l    #2,d2
  2698. 5$        move.w    0(a6,d2.l),d1    ;sample
  2699.         asr.w    d3,d1    ;scale volume
  2700. 7$        add.w    d1,(a2)+
  2701.         addq.l    #2,a2
  2702.         add.w    d6,d4    ;fraction += advfract
  2703.         bcs.s    8$
  2704.         dbra    d0,6$
  2705.         asr.l    #1,d2
  2706.         move.l    a3,d3
  2707.         rts
  2708. 8$        subq.l    #2,d2
  2709.         dbra    d0,4$
  2710.         asr.l    #1,d2
  2711.         move.l    a3,d3
  2712.         rts
  2713.  
  2714. ; -------------------------------------------------------------------
  2715. ; Mixing routine: Stereo right ch, 16-bit, backwards, 68000
  2716. ; -------------------------------------------------------------------
  2717.  
  2718. MIXb_stereo16r    movea.l    ci_sample_start(a5),a6
  2719.         adda.l    ci_rightch_offs(a5),a6
  2720.         move.l    d3,a3    ;store
  2721.         move.w    ci_volshift_r(a5),d3
  2722.         tst.w    d5
  2723.         beq.s    3$
  2724.         lsr.w    #1,d0
  2725.         bcs.s    2$
  2726.         subq.w    #1,d0
  2727. 1$        move.l    d2,d1
  2728.         add.l    d1,d1    ;offset * 2
  2729.         move.w    0(a6,d1.l),d1    ;sample
  2730.         asr.w    d3,d1    ;scale volume
  2731.         addq.l    #2,a2
  2732.         add.w    d1,(a2)+
  2733.         add.w    d6,d4    ;fraction += advfract
  2734.         subx.l    d5,d2    ;offset += advance
  2735. 2$        move.l    d2,d1
  2736.         add.l    d1,d1    ;offset * 2
  2737.         move.w    0(a6,d1.l),d1    ;sample
  2738.         asr.w    d3,d1    ;scale volume
  2739.         addq.l    #2,a2
  2740.         add.w    d1,(a2)+
  2741.         add.w    d6,d4    ;fraction += advfract
  2742.         subx.l    d5,d2    ;offset += advance
  2743.         dbra    d0,1$
  2744.         move.l    a3,d3
  2745.         rts
  2746. 3$        add.l    d2,d2
  2747.         lsr.w    #1,d0
  2748.         bcs.s    5$
  2749.         subq.w    #1,d0
  2750. 4$        move.w    0(a6,d2.l),d1    ;sample
  2751.         asr.w    d3,d1    ;scale volume
  2752. 6$        addq.l    #2,a2
  2753.         add.w    d1,(a2)+
  2754.         add.w    d6,d4    ;fraction += advfract
  2755.         bcc.s    7$
  2756.         subq.l    #2,d2
  2757. 5$        move.w    0(a6,d2.l),d1    ;sample
  2758.         asr.w    d3,d1    ;scale volume
  2759. 7$        addq.l    #2,a2
  2760.         add.w    d1,(a2)+
  2761.         add.w    d6,d4    ;fraction += advfract
  2762.         bcs.s    8$
  2763.         dbra    d0,6$
  2764.         asr.l    #1,d2
  2765.         move.l    a3,d3
  2766.         rts
  2767. 8$        subq.l    #2,d2
  2768.         dbra    d0,4$
  2769.         asr.l    #1,d2
  2770.         move.l    a3,d3
  2771.         rts
  2772.  
  2773. ; -------------------------------------------------------------------
  2774. ; Mixing routine: Stereo centered, 16-bit, backwards, 68000
  2775. ; -------------------------------------------------------------------
  2776.  
  2777. MIXb_stereo16c    movea.l    ci_sample_start(a5),a6
  2778.         move.l    d3,a3    ;store
  2779.         move.w    ci_volshift_l(a5),d3
  2780.         tst.w    d5
  2781.         beq.s    3$
  2782.         lsr.w    #1,d0
  2783.         bcs.s    2$
  2784.         subq.w    #1,d0
  2785. 1$        move.l    d2,d1
  2786.         add.l    d1,d1    ;offset * 2
  2787.         move.w    0(a6,d1.l),d1    ;sample
  2788.         asr.w    d3,d1    ;scale volume
  2789.         add.w    d1,(a2)+
  2790.         add.w    d1,(a2)+
  2791.         add.w    d6,d4    ;fraction += advfract
  2792.         subx.l    d5,d2    ;offset += advance
  2793. 2$        move.l    d2,d1
  2794.         add.l    d1,d1    ;offset * 2
  2795.         move.w    0(a6,d1.l),d1    ;sample
  2796.         asr.w    d3,d1    ;scale volume
  2797.         add.w    d1,(a2)+
  2798.         add.w    d1,(a2)+
  2799.         add.w    d6,d4    ;fraction += advfract
  2800.         subx.l    d5,d2    ;offset += advance
  2801.         dbra    d0,1$
  2802.         move.l    a3,d3
  2803.         rts
  2804. 3$        add.l    d2,d2
  2805.         lsr.w    #1,d0
  2806.         bcs.s    5$
  2807.         subq.w    #1,d0
  2808. 4$        move.w    0(a6,d2.l),d1    ;sample
  2809.         asr.w    d3,d1    ;scale volume
  2810. 6$        add.w    d1,(a2)+
  2811.         add.w    d1,(a2)+
  2812.         add.w    d6,d4    ;fraction += advfract
  2813.         bcc.s    7$
  2814.         subq.l    #2,d2
  2815. 5$        move.w    0(a6,d2.l),d1    ;sample
  2816.         asr.w    d3,d1    ;scale volume
  2817. 7$        add.w    d1,(a2)+
  2818.         add.w    d1,(a2)+
  2819.         add.w    d6,d4    ;fraction += advfract
  2820.         bcs.s    8$
  2821.         dbra    d0,6$
  2822.         asr.l    #1,d2
  2823.         move.l    a3,d3
  2824.         rts
  2825. 8$        subq.l    #2,d2
  2826.         dbra    d0,4$
  2827.         asr.l    #1,d2
  2828.         move.l    a3,d3
  2829.         rts
  2830.  
  2831. ; -------------------------------------------------------------------
  2832. ; Mixing routine: Stereo generic, 16-bit, backwards, 68000
  2833. ; -------------------------------------------------------------------
  2834.  
  2835. MIXb_stereo16    movea.l    ci_sample_start(a5),a6
  2836.         swap    d3    ;upper words are free for scratch
  2837.         swap    d7    ;use
  2838.         move.w    d6,a3
  2839.         move.w    ci_volshift_l(a5),d3
  2840.         move.w    ci_volshift_r(a5),d7
  2841.         tst.w    d5
  2842.         beq.s    3$
  2843.         lsr.w    #1,d0
  2844.         bcs.s    2$
  2845.         subq.w    #1,d0
  2846. 1$        move.l    d2,d1
  2847.         add.l    d1,d1    ;offset * 2
  2848.         move.w    0(a6,d1.l),d1    ;sample
  2849.         move.w    d1,d6
  2850.         asr.w    d3,d1    ;scale volume
  2851.         add.w    d1,(a2)+
  2852.         asr.w    d7,d6
  2853.         add.w    d6,(a2)+
  2854.         add.w    a3,d4    ;fraction += advfract
  2855.         subx.l    d5,d2    ;offset += advance
  2856. 2$        move.l    d2,d1
  2857.         add.l    d1,d1    ;offset * 2
  2858.         move.w    0(a6,d1.l),d1    ;sample
  2859.         move.w    d1,d6
  2860.         asr.w    d3,d1    ;scale volume
  2861.         add.w    d1,(a2)+
  2862.         asr.w    d7,d6
  2863.         add.w    d6,(a2)+
  2864.         add.w    a3,d4
  2865.         subx.l    d5,d2
  2866.         dbra    d0,1$
  2867.         move.l    a3,d6
  2868.         swap    d3
  2869.         swap    d7
  2870.         rts
  2871. 3$        add.l    d2,d2
  2872.         lsr.w    #1,d0
  2873.         bcs.s    5$
  2874.         subq.w    #1,d0
  2875. 4$        move.w    0(a6,d2.l),d1    ;sample
  2876.         move.w    d1,d6
  2877.         asr.w    d3,d1
  2878.         asr.w    d7,d6
  2879. 6$        add.w    d1,(a2)+
  2880.         add.w    d6,(a2)+
  2881.         add.w    a3,d4    ;fraction += advfract
  2882.         bcc.s    7$
  2883.         subq.l    #2,d2
  2884. 5$        move.w    0(a6,d2.l),d1    ;sample
  2885.         move.w    d1,d6
  2886.         asr.w    d3,d1    ;scale volume
  2887.         asr.w    d7,d6
  2888. 7$        add.w    d1,(a2)+
  2889.         add.w    d6,(a2)+
  2890.         add.w    a3,d4    ;fraction += advfract
  2891.         bcs.s    8$
  2892.         dbra    d0,6$
  2893.         asr.l    #1,d2
  2894.         move.l    a3,d6
  2895.         swap    d3
  2896.         swap    d7
  2897.         rts
  2898. 8$        subq.l    #2,d2
  2899.         dbra    d0,4$
  2900.         asr.l    #1,d2
  2901.         move.l    a3,d6
  2902.         swap    d3
  2903.         swap    d7
  2904.         rts
  2905.     ENDC
  2906.  
  2907.     IFNE    SUPPORT_020
  2908. ; -------------------------------------------------------------------
  2909. ; Mixing routine: Stereo generic, 8-bit, forwards, 68020+
  2910. ; -------------------------------------------------------------------
  2911.  
  2912. MIX_stereo8_020    movea.l    ci_sample_start(a5),a6
  2913.         movem.l    ci_voltable_l(a5),a0/a3
  2914.         swap    d3
  2915.         tst.w    d5
  2916.         beq.s    3$    ;advance zero
  2917.         lsr.w    #1,d0
  2918.         bcs.s    2$
  2919.         subq.w    #1,d0
  2920. 1$        move.b    0(a6,d2.l),d3    ;sample
  2921.         move.w    0(a0,d3.w*2),d1    ;left volume
  2922.         add.w    d1,(a2)+
  2923.         move.w    0(a3,d3.w*2),d1
  2924.         add.w    d1,(a2)+
  2925.         add.w    d6,d4    ;fraction += advfract
  2926.         addx.l    d5,d2    ;offset += advance
  2927. 2$        move.b    0(a6,d2.l),d3
  2928.         move.w    0(a0,d3.w*2),d1
  2929.         add.w    d1,(a2)+
  2930.         move.w    0(a3,d3.w*2),d1
  2931.         add.w    d1,(a2)+
  2932.         add.w    d6,d4
  2933.         addx.l    d5,d2
  2934.         dbra    d0,1$
  2935.         swap    d3
  2936.         rts
  2937. 3$        swap    d7
  2938.         move.l    a4,-(sp)
  2939.         movea.l    a6,a4
  2940.         add.l    d2,a4
  2941.         lsr.w    #1,d0
  2942.         bcs.s    5$
  2943.         subq.w    #1,d0
  2944. 4$        move.b    (a4)+,d3
  2945.         move.w    0(a0,d3.w*2),d7    ;left volume
  2946.         move.w    0(a3,d3.w*2),d1
  2947. 6$        add.w    d7,(a2)+
  2948.         add.w    d1,(a2)+
  2949.         add.w    d6,d4
  2950.         bcc.s    7$
  2951. 5$        move.b    (a4)+,d3
  2952.         move.w    0(a0,d3.w*2),d7
  2953.         move.w    0(a3,d3.w*2),d1
  2954. 7$        add.w    d7,(a2)+
  2955.         add.w    d1,(a2)+
  2956.         add.w    d6,d4
  2957.         bcs.s    8$
  2958.         dbra    d0,6$
  2959.         suba.l    a6,a4
  2960.         move.l    a4,d2
  2961.         subq.l    #1,d2
  2962.         swap    d7
  2963.         swap    d3
  2964.         move.l    (sp)+,a4
  2965.         rts
  2966. 8$        dbra    d0,4$
  2967.         suba.l    a6,a4
  2968.         move.l    a4,d2
  2969.         swap    d7
  2970.         swap    d3
  2971.         move.l    (sp)+,a4
  2972.         rts
  2973.  
  2974. ; -------------------------------------------------------------------
  2975. ; Mixing routine: Stereo left ch, 8-bit, forwards, 68020+
  2976. ; -------------------------------------------------------------------
  2977.  
  2978. MIX_stereo8l_020
  2979.         movea.l    ci_sample_start(a5),a6
  2980.         movea.l    ci_voltable_l(a5),a0
  2981.         swap    d3
  2982.         tst.w    d5
  2983.         beq.s    3$    ;advance zero
  2984.         lsr.w    #1,d0
  2985.         bcs.s    2$
  2986.         subq.w    #1,d0
  2987. 1$        move.b    0(a6,d2.l),d3    ;sample
  2988.         move.w    0(a0,d3.w*2),d1    ;left volume
  2989.         add.w    d1,(a2)
  2990.         addq.l    #4,a2
  2991.         add.w    d6,d4    ;fraction += advfract
  2992.         addx.l    d5,d2    ;offset += advance
  2993. 2$        moveq    #0,d1
  2994.         move.b    0(a6,d2.l),d3
  2995.         move.w    0(a0,d3.w*2),d1
  2996.         add.w    d1,(a2)
  2997.         addq.l    #4,a2
  2998.         add.w    d6,d4
  2999.         addx.l    d5,d2
  3000.         dbra    d0,1$
  3001.         swap    d3
  3002.         rts
  3003. 3$        lsr.w    #1,d0
  3004.         bcs.s    5$
  3005.         subq.w    #1,d0
  3006. 4$        move.b    0(a6,d2.l),d3
  3007.         move.w    0(a0,d3.w*2),d1    ;left volume
  3008. 6$        add.w    d1,(a2)
  3009.         addq.l    #4,a2
  3010.         add.w    d6,d4
  3011.         bcc.s    7$
  3012.         addq.l    #1,d2
  3013. 5$        move.b    0(a6,d2.l),d3
  3014.         move.w    0(a0,d3.w*2),d1
  3015. 7$        add.w    d1,(a2)
  3016.         addq.l    #4,a2
  3017.         add.w    d6,d4
  3018.         bcs.s    8$
  3019.         dbra    d0,6$
  3020.         swap    d3
  3021.         rts
  3022. 8$        addq.l    #1,d2
  3023.         dbra    d0,4$
  3024.         swap    d3
  3025.         rts
  3026.  
  3027. ; -------------------------------------------------------------------
  3028. ; Mixing routine: Stereo right ch, 8-bit, forwards, 68020+
  3029. ; -------------------------------------------------------------------
  3030.  
  3031. MIX_stereo8r_020
  3032.         movea.l    ci_sample_start(a5),a6
  3033.         adda.l    ci_rightch_offs(a5),a6
  3034.         movea.l    ci_voltable_r(a5),a0
  3035.         swap    d3
  3036.         tst.w    d5
  3037.         beq.s    3$    ;advance zero
  3038.         lsr.w    #1,d0
  3039.         bcs.s    2$
  3040.         subq.w    #1,d0
  3041. 1$        move.b    0(a6,d2.l),d3    ;sample
  3042.         move.w    0(a0,d3.w*2),d1    ;left volume
  3043.         addq.l    #2,a2
  3044.         add.w    d1,(a2)+
  3045.         add.w    d6,d4    ;fraction += advfract
  3046.         addx.l    d5,d2    ;offset += advance
  3047. 2$        move.b    0(a6,d2.l),d3
  3048.         move.w    0(a0,d3.w*2),d1
  3049.         addq.l    #2,a2
  3050.         add.w    d1,(a2)+
  3051.         add.w    d6,d4
  3052.         addx.l    d5,d2
  3053.         dbra    d0,1$
  3054.         swap    d3
  3055.         rts
  3056. 3$        movea.l    a6,a3
  3057.         add.l    d2,a3
  3058.         lsr.w    #1,d0
  3059.         bcs.s    5$
  3060.         subq.w    #1,d0
  3061. 4$        move.b    (a3)+,d3
  3062.         move.w    0(a0,d3.w*2),d1    ;left volume
  3063. 6$        addq.l    #2,a2
  3064.         add.w    d1,(a2)+
  3065.         add.w    d6,d4
  3066.         bcc.s    7$
  3067. 5$        move.b    (a3)+,d3
  3068.         move.w    0(a0,d3.w*2),d1
  3069. 7$        addq.l    #2,a2
  3070.         add.w    d1,(a2)+
  3071.         add.w    d6,d4
  3072.         bcs.s    8$
  3073.         dbra    d0,6$
  3074.         suba.l    a6,a3
  3075.         move.l    a3,d2
  3076.         subq.l    #1,d2
  3077.         swap    d3
  3078.         rts
  3079. 8$        dbra    d0,4$
  3080.         suba.l    a6,a3
  3081.         move.l    a3,d2
  3082.         swap    d3
  3083.         rts
  3084.  
  3085. ; -------------------------------------------------------------------
  3086. ; Mixing routine: Stereo centered, 8-bit, forwards, 68020+
  3087. ; -------------------------------------------------------------------
  3088.  
  3089. MIX_stereo8c_020
  3090.         movea.l    ci_sample_start(a5),a6
  3091.         movea.l    ci_voltable_l(a5),a0
  3092.         swap    d3
  3093.         tst.w    d5
  3094.         beq.s    3$    ;advance zero
  3095.         lsr.w    #1,d0
  3096.         bcs.s    2$
  3097.         subq.w    #1,d0
  3098. 1$        move.b    0(a6,d2.l),d3    ;sample
  3099.         move.w    0(a0,d3.w*2),d1    ;left volume
  3100.         add.w    d1,(a2)+
  3101.         add.w    d1,(a2)+
  3102.         add.w    d6,d4    ;fraction += advfract
  3103.         addx.l    d5,d2    ;offset += advance
  3104. 2$        move.b    0(a6,d2.l),d3
  3105.         move.w    0(a0,d3.w*2),d1
  3106.         add.w    d1,(a2)+
  3107.         add.w    d1,(a2)+
  3108.         add.w    d6,d4
  3109.         addx.l    d5,d2
  3110.         dbra    d0,1$
  3111.         swap    d3
  3112.         rts
  3113. 3$        movea.l    a6,a3
  3114.         add.l    d2,a3
  3115.         lsr.w    #1,d0
  3116.         bcs.s    5$
  3117.         subq.w    #1,d0
  3118. 4$        move.b    (a3)+,d3
  3119.         move.w    0(a0,d3.w*2),d1    ;left volume
  3120. 6$        add.w    d1,(a2)+
  3121.         add.w    d1,(a2)+
  3122.         add.w    d6,d4
  3123.         bcc.s    7$
  3124. 5$        move.b    (a3)+,d3
  3125.         move.w    0(a0,d3.w*2),d1
  3126. 7$        add.w    d1,(a2)+
  3127.         add.w    d1,(a2)+
  3128.         add.w    d6,d4
  3129.         bcs.s    8$
  3130.         dbra    d0,6$
  3131.         suba.l    a6,a3
  3132.         move.l    a3,d2
  3133.         subq.l    #1,d2
  3134.         swap    d3
  3135.         rts
  3136. 8$        dbra    d0,4$
  3137.         suba.l    a6,a3
  3138.         move.l    a3,d2
  3139.         swap    d3
  3140.         rts
  3141.  
  3142. ; -------------------------------------------------------------------
  3143. ; Mixing routine: Stereo two-channel, 8-bit, forwards, 68020+
  3144. ; -------------------------------------------------------------------
  3145.  
  3146. MIX_stereo8s_020
  3147.         move.l    a4,-(sp)
  3148.         move.l    ci_sample_start(a5),a0
  3149.         move.l    a0,a6
  3150.         adda.l    ci_rightch_offs(a5),a6
  3151.         movem.l    ci_voltable_l(a5),a3/a4
  3152.         swap    d3
  3153.         tst.w    d5
  3154.         beq.s    3$    ;advance zero
  3155.         lsr.w    #1,d0
  3156.         bcs.s    2$
  3157.         subq.w    #1,d0
  3158. 1$        move.b    0(a0,d2.l),d3    ;sample (left)
  3159.         move.w    0(a3,d3.w*2),d1    ;left volume
  3160.         add.w    d1,(a2)+
  3161.         move.b    0(a6,d2.l),d3    ;sample (right)
  3162.         move.w    0(a4,d3.w*2),d1
  3163.         add.w    d1,(a2)+
  3164.         add.w    d6,d4    ;fraction += advfract
  3165.         addx.l    d5,d2    ;offset += advance
  3166. 2$        move.b    0(a0,d2.l),d3    ;sample (left)
  3167.         move.w    0(a3,d3.w*2),d1    ;left volume
  3168.         add.w    d1,(a2)+
  3169.         move.b    0(a6,d2.l),d3    ;sample (right)
  3170.         move.w    0(a4,d3.w*2),d1
  3171.         add.w    d1,(a2)+
  3172.         add.w    d6,d4
  3173.         addx.l    d5,d2
  3174.         dbra    d0,1$
  3175.         swap    d3
  3176.         move.l    (sp)+,a4
  3177.         rts
  3178. 3$        swap    d7
  3179.         lsr.w    #1,d0
  3180.         bcs.s    5$
  3181.         subq.w    #1,d0
  3182. 4$        move.b    0(a0,d2.l),d3    ;sample (left)
  3183.         move.w    0(a3,d3.w*2),d1    ;left volume
  3184.         move.b    0(a6,d2.l),d3    ;sample (right)
  3185.         move.w    0(a4,d3.w*2),d7
  3186. 6$        add.w    d1,(a2)+
  3187.         add.w    d7,(a2)+
  3188.         add.w    d6,d4
  3189.         bcc.s    7$
  3190.         addq.l    #1,d2
  3191. 5$        move.b    0(a0,d2.l),d3    ;sample (left)
  3192.         move.w    0(a3,d3.w*2),d1    ;left volume
  3193.         move.b    0(a6,d2.l),d3    ;sample (right)
  3194.         move.w    0(a4,d3.w*2),d7
  3195. 7$        add.w    d1,(a2)+
  3196.         add.w    d7,(a2)+
  3197.         add.w    d6,d4
  3198.         bcs.s    8$
  3199.         dbra    d0,6$
  3200.         swap    d3
  3201.         swap    d7
  3202.         move.l    (sp)+,a4
  3203.         rts
  3204. 8$        addq.l    #1,d2
  3205.         dbra    d0,4$
  3206.         swap    d3
  3207.         swap    d7
  3208.         move.l    (sp)+,a4
  3209.         rts
  3210.  
  3211. ; -------------------------------------------------------------------
  3212. ; Mixing routine: Stereo generic, 8-bit, backwards, 68020+
  3213. ; -------------------------------------------------------------------
  3214.  
  3215. MIXb_stereo8_020
  3216.         movea.l    ci_sample_start(a5),a6
  3217.         movem.l    ci_voltable_l(a5),a0/a3
  3218.         swap    d3
  3219.         tst.w    d5
  3220.         beq.s    3$    ;advance zero
  3221.         lsr.w    #1,d0
  3222.         bcs.s    2$
  3223.         subq.w    #1,d0
  3224. 1$        move.b    0(a6,d2.l),d3    ;sample
  3225.         move.w    0(a0,d3.w*2),d1    ;left volume
  3226.         add.w    d1,(a2)+
  3227.         move.w    0(a3,d3.w*2),d1
  3228.         add.w    d1,(a2)+
  3229.         add.w    d6,d4    ;fraction += advfract
  3230.         subx.l    d5,d2    ;offset += advance
  3231. 2$        move.b    0(a6,d2.l),d3
  3232.         move.w    0(a0,d3.w*2),d1
  3233.         add.w    d1,(a2)+
  3234.         move.w    0(a3,d3.w*2),d1
  3235.         add.w    d1,(a2)+
  3236.         add.w    d6,d4
  3237.         subx.l    d5,d2
  3238.         dbra    d0,1$
  3239.         swap    d3
  3240.         rts
  3241. 3$        swap    d7
  3242.         move.l    a4,-(sp)
  3243.         lea    1(a6,d2.l),a4
  3244.         lsr.w    #1,d0
  3245.         bcs.s    5$
  3246.         subq.w    #1,d0
  3247. 4$        move.b    -(a4),d3
  3248.         move.w    0(a0,d3.w*2),d7    ;left volume
  3249.         move.w    0(a3,d3.w*2),d1
  3250. 6$        add.w    d7,(a2)+
  3251.         add.w    d1,(a2)+
  3252.         add.w    d6,d4
  3253.         bcc.s    7$
  3254. 5$        move.b    -(a4),d3
  3255.         move.w    0(a0,d3.w*2),d7
  3256.         move.w    0(a3,d3.w*2),d1
  3257. 7$        add.w    d7,(a2)+
  3258.         add.w    d1,(a2)+
  3259.         add.w    d6,d4
  3260.         bcs.s    8$
  3261.         dbra    d0,6$
  3262.         suba.l    a6,a4
  3263.         move.l    a4,d2
  3264.         move.l    (sp)+,a4
  3265.         swap    d7
  3266.         swap    d3
  3267.         rts
  3268. 8$        dbra    d0,4$
  3269.         suba.l    a6,a4
  3270.         move.l    a4,d2
  3271.         subq.l    #1,d2
  3272.         move.l    (sp)+,a4
  3273.         swap    d7
  3274.         swap    d3
  3275.         rts
  3276.  
  3277. ; -------------------------------------------------------------------
  3278. ; Mixing routine: Stereo left ch, 8-bit, backwards, 68020+
  3279. ; -------------------------------------------------------------------
  3280.  
  3281. MIXb_stereo8l_020
  3282.         movea.l    ci_sample_start(a5),a6
  3283.         movea.l    ci_voltable_l(a5),a0
  3284.         swap    d3
  3285.         tst.w    d5
  3286.         beq.s    3$    ;advance zero
  3287.         lsr.w    #1,d0
  3288.         bcs.s    2$
  3289.         subq.w    #1,d0
  3290. 1$        move.b    0(a6,d2.l),d3    ;sample
  3291.         move.w    0(a0,d3.w*2),d1    ;left volume
  3292.         add.w    d1,(a2)
  3293.         addq.l    #4,a2
  3294.         add.w    d6,d4    ;fraction += advfract
  3295.         subx.l    d5,d2    ;offset += advance
  3296. 2$        moveq    #0,d1
  3297.         move.b    0(a6,d2.l),d3
  3298.         move.w    0(a0,d3.w*2),d1
  3299.         add.w    d1,(a2)
  3300.         addq.l    #4,a2
  3301.         add.w    d6,d4
  3302.         subx.l    d5,d2
  3303.         dbra    d0,1$
  3304.         swap    d3
  3305.         rts
  3306. 3$        lea    1(a6,d2.l),a3
  3307.         lsr.w    #1,d0
  3308.         bcs.s    5$
  3309.         subq.w    #1,d0
  3310. 4$        move.b    -(a3),d3
  3311.         move.w    0(a0,d3.w*2),d1    ;left volume
  3312. 6$        add.w    d1,(a2)
  3313.         addq.l    #4,a2
  3314.         add.w    d6,d4
  3315.         bcc.s    7$
  3316. 5$        move.b    -(a3),d3
  3317.         move.w    0(a0,d3.w*2),d1
  3318. 7$        add.w    d1,(a2)
  3319.         addq.l    #4,a2
  3320.         add.w    d6,d4
  3321.         bcs.s    8$
  3322.         dbra    d0,6$
  3323.         suba.l    a6,a3
  3324.         move.l    a3,d2
  3325.         swap    d3
  3326.         rts
  3327. 8$        dbra    d0,4$
  3328.         suba.l    a6,a3
  3329.         move.l    a3,d2
  3330.         subq.l    #1,d2
  3331.         swap    d3
  3332.         rts
  3333.  
  3334. ; -------------------------------------------------------------------
  3335. ; Mixing routine: Stereo right ch, 8-bit, backwards, 68020+
  3336. ; -------------------------------------------------------------------
  3337.  
  3338. MIXb_stereo8r_020
  3339.         movea.l    ci_sample_start(a5),a6
  3340.         adda.l    ci_rightch_offs(a5),a6
  3341.         movea.l    ci_voltable_r(a5),a0
  3342.         swap    d3
  3343.         tst.w    d5
  3344.         beq.s    3$    ;advance zero
  3345.         lsr.w    #1,d0
  3346.         bcs.s    2$
  3347.         subq.w    #1,d0
  3348. 1$        move.b    0(a6,d2.l),d3    ;sample
  3349.         move.w    0(a0,d3.w*2),d1    ;left volume
  3350.         addq.l    #2,a2
  3351.         add.w    d1,(a2)+
  3352.         add.w    d6,d4    ;fraction += advfract
  3353.         subx.l    d5,d2    ;offset += advance
  3354. 2$        move.b    0(a6,d2.l),d3
  3355.         move.w    0(a0,d3.w*2),d1
  3356.         addq.l    #2,a2
  3357.         add.w    d1,(a2)+
  3358.         add.w    d6,d4
  3359.         subx.l    d5,d2
  3360.         dbra    d0,1$
  3361.         swap    d3
  3362.         rts
  3363. 3$        lea    1(a6,d2.l),a3
  3364.         lsr.w    #1,d0
  3365.         bcs.s    5$
  3366.         subq.w    #1,d0
  3367. 4$        move.b    -(a3),d3
  3368.         move.w    0(a0,d3.w*2),d1    ;left volume
  3369. 6$        addq.l    #2,a2
  3370.         add.w    d1,(a2)+
  3371.         add.w    d6,d4
  3372.         bcc.s    7$
  3373. 5$        move.b    -(a3),d3
  3374.         move.w    0(a0,d3.w*2),d1
  3375. 7$        addq.l    #2,a2
  3376.         add.w    d1,(a2)+
  3377.         add.w    d6,d4
  3378.         bcs.s    8$
  3379.         dbra    d0,6$
  3380.         suba.l    a6,a3
  3381.         move.l    a3,d2
  3382.         swap    d3
  3383.         rts
  3384. 8$        dbra    d0,4$
  3385.         suba.l    a6,a3
  3386.         move.l    a3,d2
  3387.         subq.l    #1,d2
  3388.         swap    d3
  3389.         rts
  3390.  
  3391. ; -------------------------------------------------------------------
  3392. ; Mixing routine: Stereo centered, 8-bit, backwards, 68020+
  3393. ; -------------------------------------------------------------------
  3394.  
  3395. MIXb_stereo8c_020
  3396.         movea.l    ci_sample_start(a5),a6
  3397.         movea.l    ci_voltable_l(a5),a0
  3398.         swap    d3
  3399.         tst.w    d5
  3400.         beq.s    3$    ;advance zero
  3401.         lsr.w    #1,d0
  3402.         bcs.s    2$
  3403.         subq.w    #1,d0
  3404. 1$        move.b    0(a6,d2.l),d3    ;sample
  3405.         move.w    0(a0,d3.w*2),d1    ;left volume
  3406.         add.w    d1,(a2)+
  3407.         add.w    d1,(a2)+
  3408.         add.w    d6,d4    ;fraction += advfract
  3409.         subx.l    d5,d2    ;offset += advance
  3410. 2$        move.b    0(a6,d2.l),d3
  3411.         move.w    0(a0,d3.w*2),d1
  3412.         add.w    d1,(a2)+
  3413.         add.w    d1,(a2)+
  3414.         add.w    d6,d4
  3415.         subx.l    d5,d2
  3416.         dbra    d0,1$
  3417.         swap    d3
  3418.         rts
  3419. 3$        lea    1(a6,d2.l),a3
  3420.         lsr.w    #1,d0
  3421.         bcs.s    5$
  3422.         subq.w    #1,d0
  3423. 4$        move.b    -(a3),d3
  3424.         move.w    0(a0,d3.w*2),d1    ;left volume
  3425. 6$        add.w    d1,(a2)+
  3426.         add.w    d1,(a2)+
  3427.         add.w    d6,d4
  3428.         bcc.s    7$
  3429. 5$        move.b    -(a3),d3
  3430.         move.w    0(a0,d3.w*2),d1
  3431. 7$        add.w    d1,(a2)+
  3432.         add.w    d1,(a2)+
  3433.         add.w    d6,d4
  3434.         bcs.s    8$
  3435.         dbra    d0,6$
  3436.         suba.l    a6,a3
  3437.         move.l    a3,d2
  3438.         swap    d3
  3439.         rts
  3440. 8$        dbra    d0,4$
  3441.         suba.l    a6,a3
  3442.         move.l    a3,d2
  3443.         subq.l    #1,d2
  3444.         swap    d3
  3445.         rts
  3446.  
  3447. ; -------------------------------------------------------------------
  3448. ; Mixing routine: Stereo two-channel, 8-bit, backwards, 68020+
  3449. ; -------------------------------------------------------------------
  3450.  
  3451. MIXb_stereo8s_020
  3452.         move.l    a4,-(sp)
  3453.         move.l    ci_sample_start(a5),a0
  3454.         move.l    a0,a6
  3455.         adda.l    ci_rightch_offs(a5),a6
  3456.         movem.l    ci_voltable_l(a5),a3/a4
  3457.         swap    d3
  3458.         tst.w    d5
  3459.         beq.s    3$    ;advance zero
  3460.         lsr.w    #1,d0
  3461.         bcs.s    2$
  3462.         subq.w    #1,d0
  3463. 1$        move.b    0(a0,d2.l),d3    ;sample (left)
  3464.         move.w    0(a3,d3.w*2),d1    ;left volume
  3465.         add.w    d1,(a2)+
  3466.         move.b    0(a6,d2.l),d3    ;sample (right)
  3467.         move.w    0(a4,d3.w*2),d1
  3468.         add.w    d1,(a2)+
  3469.         add.w    d6,d4    ;fraction += advfract
  3470.         subx.l    d5,d2    ;offset += advance
  3471. 2$        move.b    0(a0,d2.l),d3    ;sample (left)
  3472.         move.w    0(a3,d3.w*2),d1    ;left volume
  3473.         add.w    d1,(a2)+
  3474.         move.b    0(a6,d2.l),d3    ;sample (right)
  3475.         move.w    0(a4,d3.w*2),d1
  3476.         add.w    d1,(a2)+
  3477.         add.w    d6,d4
  3478.         subx.l    d5,d2
  3479.         dbra    d0,1$
  3480.         swap    d3
  3481.         move.l    (sp)+,a4
  3482.         rts
  3483. 3$        swap    d7
  3484.         lsr.w    #1,d0
  3485.         bcs.s    5$
  3486.         subq.w    #1,d0
  3487. 4$        move.b    0(a0,d2.l),d3    ;sample (left)
  3488.         move.w    0(a3,d3.w*2),d1    ;left volume
  3489.         move.b    0(a6,d2.l),d3    ;sample (right)
  3490.         move.w    0(a4,d3.w*2),d7
  3491. 6$        add.w    d1,(a2)+
  3492.         add.w    d7,(a2)+
  3493.         add.w    d6,d4
  3494.         bcc.s    7$
  3495.         subq.l    #1,d2
  3496. 5$        move.b    0(a0,d2.l),d3    ;sample (left)
  3497.         move.w    0(a3,d3.w*2),d1    ;left volume
  3498.         move.b    0(a6,d2.l),d3    ;sample (right)
  3499.         move.w    0(a4,d3.w*2),d7
  3500. 7$        add.w    d1,(a2)+
  3501.         add.w    d7,(a2)+
  3502.         add.w    d6,d4
  3503.         bcs.s    8$
  3504.         dbra    d0,6$
  3505.         swap    d3
  3506.         swap    d7
  3507.         move.l    (sp)+,a4
  3508.         rts
  3509. 8$        subq.l    #1,d2
  3510.         dbra    d0,4$
  3511.         swap    d3
  3512.         swap    d7
  3513.         move.l    (sp)+,a4
  3514.         rts
  3515.  
  3516. ; -------------------------------------------------------------------
  3517. ; Mixing routine: Stereo two-channel, 16-bit, forwards, 68020+
  3518. ; -------------------------------------------------------------------
  3519.  
  3520. MIX_stereo16s_020
  3521.         move.l    ci_sample_start(a5),a0
  3522.         movea.l    a0,a6
  3523.         adda.l    ci_rightch_offs(a5),a6
  3524.         swap    d3
  3525.         swap    d7
  3526.         move.w    ci_volshift_l(a5),d3
  3527.         move.w    ci_volshift_r(a5),d7
  3528.         lsr.w    #1,d0
  3529.         bcs.s    2$
  3530.         subq.w    #1,d0
  3531. 1$        move.w    0(a0,d2.l*2),d1    ;sample (L)
  3532.         asr.w    d3,d1    ;scale vol (L)
  3533.         add.w    d1,(a2)+
  3534.         move.w    0(a6,d2.l*2),d1
  3535.         asr.w    d7,d1    ;scale vol (R)
  3536.         add.w    d1,(a2)+
  3537.         add.w    d6,d4    ;fraction += advfract
  3538.         addx.l    d5,d2    ;offset += advance
  3539. 2$        move.w    0(a0,d2.l*2),d1    ;sample (L)
  3540.         asr.w    d3,d1    ;scale vol (L)
  3541.         add.w    d1,(a2)+
  3542.         move.w    0(a6,d2.l*2),d1
  3543.         asr.w    d7,d1    ;scale vol (R)
  3544.         add.w    d1,(a2)+
  3545.         add.w    d6,d4    ;fraction += advfract
  3546.         addx.l    d5,d2    ;offset += advance
  3547.         dbra    d0,1$
  3548.         swap    d3
  3549.         swap    d7
  3550.         rts
  3551.  
  3552. ; -------------------------------------------------------------------
  3553. ; Mixing routine: Stereo left ch, 16-bit, forwards, 68020+
  3554. ; -------------------------------------------------------------------
  3555.  
  3556. MIX_stereo16l_020
  3557.         movea.l    ci_sample_start(a5),a6
  3558.         move.l    d3,a3    ;store
  3559.         move.w    ci_volshift_l(a5),d3
  3560.         tst.w    d5
  3561.         beq.s    3$
  3562.         lsr.w    #1,d0
  3563.         bcs.s    2$
  3564.         subq.w    #1,d0
  3565. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3566.         asr.w    d3,d1    ;scale volume
  3567.         add.w    d1,(a2)+
  3568.         addq.l    #2,a2
  3569.         add.w    d6,d4    ;fraction += advfract
  3570.         addx.l    d5,d2    ;offset += advance
  3571. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3572.         asr.w    d3,d1    ;scale volume
  3573.         add.w    d1,(a2)+
  3574.         addq.l    #2,a2
  3575.         add.w    d6,d4    ;fraction += advfract
  3576.         addx.l    d5,d2    ;offset += advance
  3577.         dbra    d0,1$
  3578.         move.l    a3,d3
  3579.         rts
  3580. 3$        lea    0(a6,d2.l*2),a0
  3581.         lsr.w    #1,d0
  3582.         bcs.s    5$
  3583.         subq.w    #1,d0
  3584. 4$        move.w    (a0)+,d1    ;sample
  3585.         asr.w    d3,d1    ;scale volume
  3586. 6$        add.w    d1,(a2)+
  3587.         addq.l    #2,a2
  3588.         add.w    d6,d4    ;fraction += advfract
  3589.         bcc.s    7$
  3590.         addq.l    #1,d2
  3591. 5$        move.w    (a0)+,d1    ;sample
  3592.         asr.w    d3,d1    ;scale volume
  3593. 7$        add.w    d1,(a2)+
  3594.         addq.l    #2,a2
  3595.         add.w    d6,d4    ;fraction += advfract
  3596.         bcs.s    8$
  3597.         dbra    d0,6$
  3598.         suba.l    a6,a0
  3599.         move.l    a0,d2
  3600.         subq.l    #2,d2
  3601.         lsr.l    #1,d2
  3602.         move.l    a3,d3
  3603.         rts
  3604. 8$        dbra    d0,4$
  3605.         suba.l    a6,a0
  3606.         move.l    a0,d2
  3607.         lsr.l    #1,d2
  3608.         move.l    a3,d3
  3609.         rts
  3610.  
  3611. ; -------------------------------------------------------------------
  3612. ; Mixing routine: Stereo right ch, 16-bit, forwards, 68020+
  3613. ; -------------------------------------------------------------------
  3614.  
  3615. MIX_stereo16r_020
  3616.         movea.l    ci_sample_start(a5),a6
  3617.         adda.l    ci_rightch_offs(a5),a6
  3618.         move.l    d3,a3    ;store
  3619.         move.w    ci_volshift_r(a5),d3
  3620.         tst.w    d5
  3621.         beq.s    3$
  3622.         lsr.w    #1,d0
  3623.         bcs.s    2$
  3624.         subq.w    #1,d0
  3625. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3626.         asr.w    d3,d1    ;scale volume
  3627.         addq.l    #2,a2
  3628.         add.w    d1,(a2)+
  3629.         add.w    d6,d4    ;fraction += advfract
  3630.         addx.l    d5,d2    ;offset += advance
  3631. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3632.         asr.w    d3,d1    ;scale volume
  3633.         addq.l    #2,a2
  3634.         add.w    d1,(a2)+
  3635.         add.w    d6,d4    ;fraction += advfract
  3636.         addx.l    d5,d2    ;offset += advance
  3637.         dbra    d0,1$
  3638.         move.l    a3,d3
  3639.         rts
  3640. 3$        lea    0(a6,d2.l*2),a0
  3641.         lsr.w    #1,d0
  3642.         bcs.s    5$
  3643.         subq.w    #1,d0
  3644. 4$        move.w    (a0)+,d1    ;sample
  3645.         asr.w    d3,d1    ;scale volume
  3646. 6$        addq.l    #2,a2
  3647.         add.w    d1,(a2)+
  3648.         add.w    d6,d4    ;fraction += advfract
  3649.         bcc.s    7$
  3650. 5$        move.w    (a0)+,d1    ;sample
  3651.         asr.w    d3,d1    ;scale volume
  3652. 7$        addq.l    #2,a2
  3653.         add.w    d1,(a2)+
  3654.         add.w    d6,d4    ;fraction += advfract
  3655.         bcs.s    8$
  3656.         dbra    d0,6$
  3657.         suba.l    a6,a0
  3658.         move.l    a0,d2
  3659.         subq.l    #2,d2
  3660.         lsr.l    #1,d2
  3661.         move.l    a3,d3
  3662.         rts
  3663. 8$        dbra    d0,4$
  3664.         suba.l    a6,a0
  3665.         move.l    a0,d2
  3666.         lsr.l    #1,d2
  3667.         move.l    a3,d3
  3668.         rts
  3669.  
  3670. ; -------------------------------------------------------------------
  3671. ; Mixing routine: Stereo centered, 16-bit, forwards, 68020+
  3672. ; -------------------------------------------------------------------
  3673.  
  3674. MIX_stereo16c_020
  3675.         movea.l    ci_sample_start(a5),a6
  3676.         move.l    d3,a3    ;store
  3677.         move.w    ci_volshift_l(a5),d3
  3678.         tst.w    d5
  3679.         beq.s    3$
  3680.         lsr.w    #1,d0
  3681.         bcs.s    2$
  3682.         subq.w    #1,d0
  3683. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3684.         asr.w    d3,d1    ;scale volume
  3685.         add.w    d1,(a2)+
  3686.         add.w    d1,(a2)+
  3687.         add.w    d6,d4    ;fraction += advfract
  3688.         addx.l    d5,d2    ;offset += advance
  3689. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3690.         asr.w    d3,d1    ;scale volume
  3691.         add.w    d1,(a2)+
  3692.         add.w    d1,(a2)+
  3693.         add.w    d6,d4    ;fraction += advfract
  3694.         addx.l    d5,d2    ;offset += advance
  3695.         dbra    d0,1$
  3696.         move.l    a3,d3
  3697.         rts
  3698. 3$        lea    0(a6,d2.l*2),a0
  3699.         lsr.w    #1,d0
  3700.         bcs.s    5$
  3701.         subq.w    #1,d0
  3702. 4$        move.w    (a0)+,d1    ;sample
  3703.         asr.w    d3,d1    ;scale volume
  3704. 6$        add.w    d1,(a2)+
  3705.         add.w    d1,(a2)+
  3706.         add.w    d6,d4    ;fraction += advfract
  3707.         bcc.s    7$
  3708. 5$        move.w    (a0)+,d1    ;sample
  3709.         asr.w    d3,d1    ;scale volume
  3710. 7$        add.w    d1,(a2)+
  3711.         add.w    d1,(a2)+
  3712.         add.w    d6,d4    ;fraction += advfract
  3713.         bcs.s    8$
  3714.         dbra    d0,6$
  3715.         suba.l    a6,a0
  3716.         move.l    a0,d2
  3717.         subq.l    #2,d2
  3718.         lsr.l    #1,d2
  3719.         move.l    a3,d3
  3720.         rts
  3721. 8$        dbra    d0,4$
  3722.         suba.l    a6,a0
  3723.         move.l    a0,d2
  3724.         lsr.l    #1,d2
  3725.         move.l    a3,d3
  3726.         rts
  3727.  
  3728. ; -------------------------------------------------------------------
  3729. ; Mixing routine: Stereo generic, 16-bit, forwards, 68020+
  3730. ; -------------------------------------------------------------------
  3731.  
  3732. MIX_stereo16_020
  3733.         movea.l    ci_sample_start(a5),a6
  3734.         swap    d3    ;upper words are free for scratch
  3735.         swap    d7    ;use
  3736.         move.w    d6,a3
  3737.         move.w    ci_volshift_l(a5),d3
  3738.         move.w    ci_volshift_r(a5),d7
  3739.         tst.w    d5
  3740.         beq.s    3$
  3741.         lsr.w    #1,d0
  3742.         bcs.s    2$
  3743.         subq.w    #1,d0
  3744. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3745.         move.w    d1,d6
  3746.         asr.w    d3,d1    ;scale volume
  3747.         add.w    d1,(a2)+
  3748.         asr.w    d7,d6
  3749.         add.w    d6,(a2)+
  3750.         add.w    a3,d4    ;fraction += advfract
  3751.         addx.l    d5,d2    ;offset += advance
  3752. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3753.         move.w    d1,d6
  3754.         asr.w    d3,d1    ;scale volume
  3755.         add.w    d1,(a2)+
  3756.         asr.w    d7,d6
  3757.         add.w    d6,(a2)+
  3758.         add.w    a3,d4
  3759.         addx.l    d5,d2
  3760.         dbra    d0,1$
  3761.         move.l    a3,d6
  3762.         swap    d3
  3763.         swap    d7
  3764.         rts
  3765. 3$        lea    0(a6,d2.l*2),a0
  3766.         lsr.w    #1,d0
  3767.         bcs.s    5$
  3768.         subq.w    #1,d0
  3769. 4$        move.w    (a0)+,d1    ;sample
  3770.         move.w    d1,d6
  3771.         asr.w    d3,d1
  3772.         asr.w    d7,d6
  3773. 6$        add.w    d1,(a2)+
  3774.         add.w    d6,(a2)+
  3775.         add.w    a3,d4    ;fraction += advfract
  3776.         bcc.s    7$
  3777. 5$        move.w    (a0)+,d1    ;sample
  3778.         move.w    d1,d6
  3779.         asr.w    d3,d1    ;scale volume
  3780.         asr.w    d7,d6
  3781. 7$        add.w    d1,(a2)+
  3782.         add.w    d6,(a2)+
  3783.         add.w    a3,d4    ;fraction += advfract
  3784.         bcs.s    8$
  3785.         dbra    d0,6$
  3786.         suba.l    a6,a0
  3787.         move.l    a0,d2
  3788.         subq.l    #2,d2
  3789.         lsr.l    #1,d2
  3790.         move.l    a3,d6
  3791.         swap    d3
  3792.         swap    d7
  3793.         rts
  3794. 8$        dbra    d0,4$
  3795.         suba.l    a6,a0
  3796.         move.l    a0,d2
  3797.         lsr.l    #1,d2
  3798.         move.l    a3,d6
  3799.         swap    d3
  3800.         swap    d7
  3801.         rts
  3802.  
  3803. ; -------------------------------------------------------------------
  3804. ; Mixing routine: Stereo two-channel, 16-bit, backwards, 68020+
  3805. ; -------------------------------------------------------------------
  3806.  
  3807. MIXb_stereo16s_020
  3808.         move.l    ci_sample_start(a5),a0
  3809.         movea.l    a0,a6
  3810.         adda.l    ci_rightch_offs(a5),a6
  3811.         swap    d3
  3812.         swap    d7
  3813.         move.w    ci_volshift_l(a5),d3
  3814.         move.w    ci_volshift_r(a5),d7
  3815.         lsr.w    #1,d0
  3816.         bcs.s    2$
  3817.         subq.w    #1,d0
  3818. 1$        move.w    0(a0,d2.l*2),d1    ;sample (L)
  3819.         asr.w    d3,d1    ;scale vol (L)
  3820.         add.w    d1,(a2)+
  3821.         move.w    0(a6,d2.l*2),d1
  3822.         asr.w    d7,d1    ;scale vol (R)
  3823.         add.w    d1,(a2)+
  3824.         add.w    d6,d4    ;fraction += advfract
  3825.         subx.l    d5,d2    ;offset += advance
  3826. 2$        move.w    0(a0,d2.l*2),d1    ;sample (L)
  3827.         asr.w    d3,d1    ;scale vol (L)
  3828.         add.w    d1,(a2)+
  3829.         move.w    0(a6,d2.l*2),d1
  3830.         asr.w    d7,d1    ;scale vol (R)
  3831.         add.w    d1,(a2)+
  3832.         add.w    d6,d4    ;fraction += advfract
  3833.         subx.l    d5,d2    ;offset += advance
  3834.         dbra    d0,1$
  3835.         swap    d3
  3836.         swap    d7
  3837.         rts
  3838.  
  3839. ; -------------------------------------------------------------------
  3840. ; Mixing routine: Stereo left ch, 16-bit, backwards, 68020+
  3841. ; -------------------------------------------------------------------
  3842.  
  3843. MIXb_stereo16l_020
  3844.         movea.l    ci_sample_start(a5),a6
  3845.         move.l    d3,a3    ;store
  3846.         move.w    ci_volshift_l(a5),d3
  3847.         tst.w    d5
  3848.         beq.s    3$
  3849.         lsr.w    #1,d0
  3850.         bcs.s    2$
  3851.         subq.w    #1,d0
  3852. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3853.         asr.w    d3,d1    ;scale volume
  3854.         add.w    d1,(a2)+
  3855.         addq.l    #2,a2
  3856.         add.w    d6,d4    ;fraction += advfract
  3857.         subx.l    d5,d2    ;offset += advance
  3858. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3859.         asr.w    d3,d1    ;scale volume
  3860.         add.w    d1,(a2)+
  3861.         addq.l    #2,a2
  3862.         add.w    d6,d4    ;fraction += advfract
  3863.         subx.l    d5,d2    ;offset += advance
  3864.         dbra    d0,1$
  3865.         move.l    a3,d3
  3866.         rts
  3867. 3$        lea    2(a6,d2.l*2),a0
  3868.         lsr.w    #1,d0
  3869.         bcs.s    5$
  3870.         subq.w    #1,d0
  3871. 4$        move.w    -(a0),d1    ;sample
  3872.         asr.w    d3,d1    ;scale volume
  3873. 6$        add.w    d1,(a2)+
  3874.         addq.l    #2,a2
  3875.         add.w    d6,d4    ;fraction += advfract
  3876.         bcc.s    7$
  3877. 5$        move.w    -(a0),d1    ;sample
  3878.         asr.w    d3,d1    ;scale volume
  3879. 7$        add.w    d1,(a2)+
  3880.         addq.l    #2,a2
  3881.         add.w    d6,d4    ;fraction += advfract
  3882.         bcs.s    8$
  3883.         dbra    d0,6$
  3884.         suba.l    a6,a0
  3885.         move.l    a0,d2
  3886.         lsr.l    #1,d2
  3887.         move.l    a3,d3
  3888.         rts
  3889. 8$        dbra    d0,4$
  3890.         suba.l    a6,a0
  3891.         move.l    a0,d2
  3892.         subq.l    #2,d2
  3893.         lsr.l    #1,d2
  3894.         move.l    a3,d3
  3895.         rts
  3896.  
  3897. ; -------------------------------------------------------------------
  3898. ; Mixing routine: Stereo right ch, 16-bit, backwards, 68020+
  3899. ; -------------------------------------------------------------------
  3900.  
  3901. MIXb_stereo16r_020
  3902.         movea.l    ci_sample_start(a5),a6
  3903.         adda.l    ci_rightch_offs(a5),a6
  3904.         move.l    d3,a3    ;store
  3905.         move.w    ci_volshift_r(a5),d3
  3906.         tst.w    d5
  3907.         beq.s    3$
  3908.         lsr.w    #1,d0
  3909.         bcs.s    2$
  3910.         subq.w    #1,d0
  3911. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3912.         asr.w    d3,d1    ;scale volume
  3913.         addq.l    #2,a2
  3914.         add.w    d1,(a2)+
  3915.         add.w    d6,d4    ;fraction += advfract
  3916.         subx.l    d5,d2    ;offset += advance
  3917. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3918.         asr.w    d3,d1    ;scale volume
  3919.         addq.l    #2,a2
  3920.         add.w    d1,(a2)+
  3921.         add.w    d6,d4    ;fraction += advfract
  3922.         subx.l    d5,d2    ;offset += advance
  3923.         dbra    d0,1$
  3924.         move.l    a3,d3
  3925.         rts
  3926. 3$        lea    2(a6,d2.l*2),a0
  3927.         lsr.w    #1,d0
  3928.         bcs.s    5$
  3929.         subq.w    #1,d0
  3930. 4$        move.w    -(a0),d1    ;sample
  3931.         asr.w    d3,d1    ;scale volume
  3932. 6$        addq.l    #2,a2
  3933.         add.w    d1,(a2)+
  3934.         add.w    d6,d4    ;fraction += advfract
  3935.         bcc.s    7$
  3936. 5$        move.w    -(a0),d1    ;sample
  3937.         asr.w    d3,d1    ;scale volume
  3938. 7$        addq.l    #2,a2
  3939.         add.w    d1,(a2)+
  3940.         add.w    d6,d4    ;fraction += advfract
  3941.         bcs.s    8$
  3942.         dbra    d0,6$
  3943.         suba.l    a6,a0
  3944.         move.l    a0,d2
  3945.         lsr.l    #1,d2
  3946.         move.l    a3,d3
  3947.         rts
  3948. 8$        dbra    d0,4$
  3949.         suba.l    a6,a0
  3950.         move.l    a0,d2
  3951.         subq.l    #2,d2
  3952.         lsr.l    #1,d2
  3953.         move.l    a3,d3
  3954.         rts
  3955.  
  3956. ; -------------------------------------------------------------------
  3957. ; Mixing routine: Stereo centered, 16-bit, backwards, 68020+
  3958. ; -------------------------------------------------------------------
  3959.  
  3960. MIXb_stereo16c_020
  3961.         movea.l    ci_sample_start(a5),a6
  3962.         move.l    d3,a3    ;store
  3963.         move.w    ci_volshift_l(a5),d3
  3964.         tst.w    d5
  3965.         beq.s    3$
  3966.         lsr.w    #1,d0
  3967.         bcs.s    2$
  3968.         subq.w    #1,d0
  3969. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  3970.         asr.w    d3,d1    ;scale volume
  3971.         add.w    d1,(a2)+
  3972.         add.w    d1,(a2)+
  3973.         add.w    d6,d4    ;fraction += advfract
  3974.         subx.l    d5,d2    ;offset += advance
  3975. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  3976.         asr.w    d3,d1    ;scale volume
  3977.         add.w    d1,(a2)+
  3978.         add.w    d1,(a2)+
  3979.         add.w    d6,d4    ;fraction += advfract
  3980.         subx.l    d5,d2    ;offset += advance
  3981.         dbra    d0,1$
  3982.         move.l    a3,d3
  3983.         rts
  3984. 3$        lea    2(a6,d2.l*2),a0
  3985.         lsr.w    #1,d0
  3986.         bcs.s    5$
  3987.         subq.w    #1,d0
  3988. 4$        move.w    -(a0),d1    ;sample
  3989.         asr.w    d3,d1    ;scale volume
  3990. 6$        add.w    d1,(a2)+
  3991.         add.w    d1,(a2)+
  3992.         add.w    d6,d4    ;fraction += advfract
  3993.         bcc.s    7$
  3994. 5$        move.w    -(a0),d1    ;sample
  3995.         asr.w    d3,d1    ;scale volume
  3996. 7$        add.w    d1,(a2)+
  3997.         add.w    d1,(a2)+
  3998.         add.w    d6,d4    ;fraction += advfract
  3999.         bcs.s    8$
  4000.         dbra    d0,6$
  4001.         suba.l    a6,a0
  4002.         move.l    a0,d2
  4003.         lsr.l    #1,d2
  4004.         move.l    a3,d3
  4005.         rts
  4006. 8$        dbra    d0,4$
  4007.         suba.l    a6,a0
  4008.         move.l    a0,d2
  4009.         subq.l    #2,d2
  4010.         lsr.l    #1,d2
  4011.         move.l    a3,d3
  4012.         rts
  4013.  
  4014. ; -------------------------------------------------------------------
  4015. ; Mixing routine: Stereo generic, 16-bit, backwards, 68020+
  4016. ; -------------------------------------------------------------------
  4017.  
  4018. MIXb_stereo16_020
  4019.         movea.l    ci_sample_start(a5),a6
  4020.         swap    d3    ;upper words are free for scratch
  4021.         swap    d7    ;use
  4022.         move.w    d6,a3
  4023.         move.w    ci_volshift_l(a5),d3
  4024.         move.w    ci_volshift_r(a5),d7
  4025.         tst.w    d5
  4026.         beq.s    3$
  4027.         lsr.w    #1,d0
  4028.         bcs.s    2$
  4029.         subq.w    #1,d0
  4030. 1$        move.w    0(a6,d2.l*2),d1    ;sample
  4031.         move.w    d1,d6
  4032.         asr.w    d3,d1    ;scale volume
  4033.         add.w    d1,(a2)+
  4034.         asr.w    d7,d6
  4035.         add.w    d6,(a2)+
  4036.         add.w    a3,d4    ;fraction += advfract
  4037.         subx.l    d5,d2    ;offset += advance
  4038. 2$        move.w    0(a6,d2.l*2),d1    ;sample
  4039.         move.w    d1,d6
  4040.         asr.w    d3,d1    ;scale volume
  4041.         add.w    d1,(a2)+
  4042.         asr.w    d7,d6
  4043.         add.w    d6,(a2)+
  4044.         add.w    a3,d4
  4045.         subx.l    d5,d2
  4046.         dbra    d0,1$
  4047.         move.l    a3,d6
  4048.         swap    d3
  4049.         swap    d7
  4050.         rts
  4051. 3$        lsr.w    #1,d0
  4052.         bcs.s    5$
  4053.         subq.w    #1,d0
  4054. 4$        move.w    0(a6,d2.l*2),d1    ;sample
  4055.         move.w    d1,d6
  4056.         asr.w    d3,d1
  4057.         asr.w    d7,d6
  4058. 6$        add.w    d1,(a2)+
  4059.         add.w    d6,(a2)+
  4060.         add.w    a3,d4    ;fraction += advfract
  4061.         bcc.s    7$
  4062.         subq.l    #1,d2
  4063. 5$        move.w    0(a6,d2.l*2),d1    ;sample
  4064.         move.w    d1,d6
  4065.         asr.w    d3,d1    ;scale volume
  4066.         asr.w    d7,d6
  4067. 7$        add.w    d1,(a2)+
  4068.         add.w    d6,(a2)+
  4069.         add.w    a3,d4    ;fraction += advfract
  4070.         bcs.s    8$
  4071.         dbra    d0,6$
  4072.         move.l    a3,d6
  4073.         swap    d3
  4074.         swap    d7
  4075.         rts
  4076. 8$        subq.l    #1,d2
  4077.         dbra    d0,4$
  4078.         move.l    a3,d6
  4079.         swap    d3
  4080.         swap    d7
  4081.         rts
  4082.     ENDC
  4083.  
  4084. ; -------------------------------------------------------------------
  4085. ; Interface routines called by the player routine.
  4086. ; -------------------------------------------------------------------
  4087.  
  4088.         XDEF    _MixSetTrkPeriod
  4089.  
  4090. ;    D1 = period, D7 = track number, A5 = track data
  4091.  
  4092. _MixSetTrkPeriod:
  4093.  
  4094.         cmp.w    m_channels(pc),d7
  4095.         bhs.s    mstp_exit
  4096.         movea.l    trk_cinfo(a5),a0
  4097.         moveq    #0,d0
  4098.         move.w    d1,d0
  4099.         beq.s    _ChOff_mix
  4100.         move.w    m_actualrate(pc),d1
  4101. ; CalcAdv    ;d0.l = note_freq, d1.w = actualrate_hz
  4102.         divu    d1,d0
  4103.         move.w    d0,ci_advance+2(a0)    ;set advance
  4104.         clr.w    d0
  4105.         divu    d1,d0
  4106.         move.w    d0,ci_advfract+2(a0)
  4107.         beq.s    mstp_advfract0
  4108. mstp_exit    rts
  4109.  
  4110. ; advfract == 0, if also advance == 0, stop sound (would cause
  4111. ; division by zero).
  4112. mstp_advfract0    tst.w    ci_advance+2(a0)
  4113.         beq.s    _ChOff_mix
  4114.         rts
  4115.  
  4116. ; Prepare for a synthsound. (The next MixSetSynthWF will start
  4117. ; playing from the beginning of the wf instead of waiting for
  4118. ; the previous wf to finish.)
  4119.  
  4120.         XDEF    _MixPrepSynth
  4121.  
  4122. _MixPrepSynth
  4123.         cmp.w    m_channels(pc),d7
  4124.         bhs.s    mps_exit
  4125.         movea.l    trk_cinfo(a5),a0
  4126.         bset    #CHFLAGB_STARTSYN,ci_flags(a0)
  4127. mps_exit    rts
  4128.  
  4129.  
  4130. ; Channel off. (Just set the MUTED flag.)
  4131. ; (Note: do not trash anything without modifying _ChannelOff!)
  4132.  
  4133.         XDEF    _ChOff_mix
  4134.  
  4135. _ChOff_mix
  4136.         cmp.w    m_channels(pc),d7
  4137.         bhs.s    comix_exit
  4138.         movea.l    trk_cinfo(a5),a0
  4139.         bset    #CHFLAGB_MUTED,ci_flags(a0)
  4140. comix_exit    rts
  4141.  
  4142.  
  4143. ; Set Synthsound waveform.
  4144. ; A1 = Synth waveform, D7 = track, A5 = track data
  4145.  
  4146.         XDEF    _MixSetSynthWF
  4147.  
  4148. _MixSetSynthWF
  4149.         cmp.w    m_channels(pc),d7
  4150.         bhs.s    mssw_exit
  4151.         movea.l    trk_cinfo(a5),a0
  4152.         moveq    #0,d1
  4153.         move.w    (a1)+,d1    ;synthwf length
  4154.         add.w    d1,d1        ;* 2
  4155.         move.w    d1,ci_newendoffset+2(a0)
  4156.         move.l    a1,ci_newstart_addr(a0)
  4157.         btst    #CHFLAGB_STARTSYN,ci_flags(a0)
  4158.         beq.s    mssw_setloop
  4159.         move.l    a1,ci_sample_start(a0)
  4160.         move.l    d1,ci_endoffset(a0)
  4161.         move.l    d1,ci_restartoffset(a0)
  4162.         clr.l    ci_offset(a0)
  4163. mssw_setloop    move.b    #1<<CHFLAGB_LOOP,ci_flags(a0)
  4164. mssw_exit    rts
  4165.  
  4166.  
  4167.  
  4168. ; Set volume table and mixing routine
  4169. ; D0 = volume (UBYTE), D7 = track, A5 = track data, A4 = song
  4170.  
  4171.         XDEF    _MixSetTrkVol
  4172.         XREF    _voltable,_chshift
  4173.  
  4174. mstv_exit    rts
  4175. _MixSetTrkVol
  4176.         cmp.w    m_channels(pc),d7
  4177.         bhs.s    mstv_exit
  4178.         movea.l    trk_cinfo(a5),a0
  4179. ; --- find correct handler
  4180.         subq.b    #1,d0
  4181.         bpl.s    mstv_non0
  4182.         lea    mixr_skip(pc),a1
  4183.         bra.s    mstv_set
  4184. mstv_non0    tst.b    m_stereo
  4185.         bne.s    mstv_stereo
  4186.         lea    mixr_mono(pc),a1
  4187.         bra.s    mstv_set
  4188. mstv_stereo
  4189.     IFNE    OCTAMED_INTERN
  4190.         lea    msng_trkpan(a4),a1
  4191.     ELSEIF
  4192.         move.l    msng_trkpan(a4),d1
  4193.         beq.s    mstv_nopanarray
  4194.         move.l    d1,a1
  4195.     ENDC
  4196.         move.b    0(a1,d7.w),d1    ;get pan
  4197. mstv_nopanarray    cmp.b    #-16,d1
  4198.         bne.s    mstv_noleftpan
  4199.         lea    mixr_stereol(pc),a1
  4200.         bra.s    mstv_set
  4201. mstv_noleftpan    cmp.b    #16,d1
  4202.         bne.s    mstv_norightpan
  4203.         lea    mixr_stereor(pc),a1
  4204.         bra.s    mstv_set
  4205. mstv_norightpan    btst    #CHFLAGB_STEREO,ci_flags(a0)
  4206.         beq.s    mstv_nostereos
  4207.         lea    mixr_stereos(pc),a1
  4208.         bra.s    mstv_set
  4209. mstv_nostereos    tst.b    d1
  4210.         bne.s    mstv_nocenter
  4211.         lea    mixr_stereoc(pc),a1
  4212.         bra.s    mstv_set
  4213. mstv_nocenter    lea    mixr_stereo(pc),a1
  4214. ; --- handler found... set parameters
  4215. mstv_set    btst    #CHFLAGB_16BIT,ci_flags(a0)
  4216.         bne.s    mstv_set16
  4217.         btst    #CHFLAGB_BACKW,ci_flags(a0)
  4218.         bne.s    mstv_set8b
  4219.         move.l    8(a1),ci_mixroutine(a0)    ;set 8-bit routine
  4220.         move.l    16(a1),ci_altmixroutine(a0) ;backwards
  4221.         move.l    (a1),a1
  4222.         jmp    (a1)
  4223. mstv_set8b    move.l    16(a1),ci_mixroutine(a0) ;8-bit backwards
  4224.         move.l    8(a1),ci_altmixroutine(a0) ;forwards
  4225.         move.l    (a1),a1
  4226.         jmp    (a1)
  4227. mstv_set16    btst    #CHFLAGB_BACKW,ci_flags(a0)
  4228.         bne.s    mstv_set16b
  4229.         move.l    12(a1),ci_mixroutine(a0) ;16-bit routine
  4230.         move.l    20(a1),ci_altmixroutine(a0)
  4231.         move.l    4(a1),a1
  4232.         jmp    (a1)
  4233. mstv_set16b    move.l    20(a1),ci_mixroutine(a0) ;16-bit backwards
  4234.         move.l    12(a1),ci_altmixroutine(a0)
  4235.         move.l    4(a1),a1
  4236.         jmp    (a1)
  4237.  
  4238. ; --- mono/stereo, volume zero
  4239. mstv_skip    rts
  4240. ; --- stereo 8-bit
  4241. mstv_stereo8    move.l    d2,-(sp)
  4242.         moveq    #16,d2
  4243.         sub.b    d1,d2        ;16 - trkpan
  4244.         ext.w    d0
  4245.         mulu    d0,d2        ;* (vol - 1)
  4246.         and.w    #$FFE0,d2    :/ 32 * 256 * 2..
  4247.         lsl.w    #4,d2
  4248.         move.l    _voltable,a1
  4249.         add.l    a1,d2
  4250.         move.l    d2,ci_voltable_l(a0)
  4251.         add.b    #16,d1        ;16 + trkpan
  4252.         ext.w    d1
  4253.         mulu    d0,d1        ; * (vol - 1)
  4254.         and.w    #$FFE0,d1
  4255.         lsl.w    #4,d1
  4256.         add.l    a1,d1
  4257.         move.l    d1,ci_voltable_r(a0)
  4258.         move.l    (sp)+,d2
  4259.         rts
  4260. ; --- stereo 8-bit (panned to left) or mono 8-bit
  4261. mstv_stereo8l    lsl.w    #8,d0
  4262.         move.l    _voltable,a1
  4263.         add.w    d0,d0
  4264.         adda.w    d0,a1
  4265.         move.l    a1,ci_voltable_l(a0)
  4266.         rts
  4267. ; --- stereo 8-bit (panned to right)
  4268. mstv_stereo8r    lsl.w    #8,d0
  4269.         move.l    _voltable,a1
  4270.         add.w    d0,d0
  4271.         adda.w    d0,a1
  4272.         move.l    a1,ci_voltable_r(a0)
  4273.         rts
  4274. ; --- stereo 8-bit (panned to center)
  4275. mstv_stereo8c    bclr    #0,d0
  4276.         lsl.w    #8,d0
  4277.         move.l    _voltable,a1
  4278.         adda.w    d0,a1
  4279.         move.l    a1,ci_voltable_l(a0)
  4280.         rts
  4281. ; --- stereo 16-bit (panned to left) or mono 16-bit
  4282. mstv_stereo16l    move.w    _chshift,d1
  4283.         ext.w    d0
  4284.         add.b    volshifttbl(pc,d0.w),d1
  4285.         move.w    d1,ci_volshift_l(a0)
  4286.         rts
  4287. ; --- stereo 16-bit (panned to center)
  4288. mstv_stereo16c    move.w    _chshift,d1
  4289.         ext.w    d0
  4290.         add.b    volshifttbl(pc,d0.w),d1
  4291.         addq.b    #1,d1
  4292.         move.w    d1,ci_volshift_l(a0)
  4293.         rts
  4294. ; --- stereo 16-bit
  4295. mstv_stereo16    movem.l    d2/d3,-(sp)
  4296.         moveq    #16,d2
  4297.         sub.b    d1,d2        ;16 - trkpan
  4298.         ext.w    d0
  4299.         mulu    d0,d2        ;* (vol - 1)
  4300.         lsr.w    #5,d2        ;/ 32
  4301.         move.w    _chshift,d3
  4302.         move.b    volshifttbl(pc,d2.w),d2
  4303.         add.w    d3,d2
  4304.         move.w    d2,ci_volshift_l(a0)
  4305.         add.b    #16,d1
  4306.         ext.w    d1
  4307.         mulu    d0,d1
  4308.         lsr.w    #5,d1
  4309.         add.b    volshifttbl(pc,d1.w),d3
  4310.         move.w    d3,ci_volshift_r(a0)
  4311.         movem.l    (sp)+,d2/d3
  4312.         rts
  4313. ; --- stereo 16-bit (panned to right)
  4314. mstv_stereo16r    move.w    _chshift,d1
  4315.         ext.w    d0
  4316.         add.b    volshifttbl(pc,d0.w),d1
  4317.         move.w    d1,ci_volshift_r(a0)
  4318.         rts
  4319. ; 16 bit volume shifting table
  4320. volshifttbl    dc.b    6,5,5,4,4,4,4,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1
  4321.         dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
  4322.  
  4323.     IFNE    SUPPORT_000
  4324. mixr_skip    dc.l    mstv_skip,mstv_skip,Skip,Skip,Skipb,Skipb
  4325. mixr_mono    dc.l    mstv_stereo8l,mstv_stereo16l,MIX_mono8,MIX_mono16,MIXb_mono8,MIXb_mono16
  4326. mixr_stereo    dc.l    mstv_stereo8,mstv_stereo16,MIX_stereo8,MIX_stereo16,MIXb_stereo8,MIXb_stereo16
  4327. mixr_stereol    dc.l    mstv_stereo8l,mstv_stereo16l,MIX_stereo8l,MIX_stereo16l,MIXb_stereo8l,MIXb_stereo16l
  4328. mixr_stereor    dc.l    mstv_stereo8r,mstv_stereo16r,MIX_stereo8r,MIX_stereo16r,MIXb_stereo8r,MIXb_stereo16r
  4329. mixr_stereoc    dc.l    mstv_stereo8c,mstv_stereo16c,MIX_stereo8c,MIX_stereo16c,MIXb_stereo8c,MIXb_stereo16c
  4330. mixr_stereos    dc.l    mstv_stereo8,mstv_stereo16,MIX_stereo8s,MIX_stereo16s,MIXb_stereo8s,MIXb_stereo16s
  4331.     ELSEIF
  4332. mixr_skip    dc.l    mstv_skip,mstv_skip,Skip_020,Skip_020,Skipb_020,Skipb_020
  4333. mixr_mono    dc.l    mstv_stereo8l,mstv_stereo16l,MIX_mono8_020,MIX_mono16_020,MIXb_mono8_020,MIXb_mono16_020
  4334. mixr_stereo    dc.l    mstv_stereo8,mstv_stereo16,MIX_stereo8_020,MIX_stereo16_020,MIXb_stereo8_020,MIXb_stereo16_020
  4335. mixr_stereol    dc.l    mstv_stereo8l,mstv_stereo16l,MIX_stereo8l_020,MIX_stereo16l_020,MIXb_stereo8l_020,MIXb_stereo16l_020
  4336. mixr_stereor    dc.l    mstv_stereo8r,mstv_stereo16r,MIX_stereo8r_020,MIX_stereo16r_020,MIXb_stereo8r_020,MIXb_stereo16r_020
  4337. mixr_stereoc    dc.l    mstv_stereo8c,mstv_stereo16c,MIX_stereo8c_020,MIX_stereo16c_020,MIXb_stereo8c_020,MIXb_stereo16c_020
  4338. mixr_stereos    dc.l    mstv_stereo8,mstv_stereo16,MIX_stereo8s_020,MIX_stereo16s_020,MIXb_stereo8s_020,MIXb_stereo16s_020
  4339.     ENDC
  4340.  
  4341.     IFNE    SUPPORT_000&SUPPORT_020
  4342. mixr_020    dc.l    Skip_020,Skip_020,Skipb_020,Skipb_020
  4343.         dc.l    MIX_mono8_020,MIX_mono16_020,MIXb_mono8_020,MIXb_mono16_020
  4344.         dc.l    MIX_stereo8_020,MIX_stereo16_020,MIXb_stereo8_020,MIXb_stereo16_020
  4345.         dc.l    MIX_stereo8l_020,MIX_stereo16l_020,MIXb_stereo8l_020,MIXb_stereo16l_020
  4346.         dc.l    MIX_stereo8r_020,MIX_stereo16r_020,MIXb_stereo8r_020,MIXb_stereo16r_020
  4347.         dc.l    MIX_stereo8c_020,MIX_stereo16c_020,MIXb_stereo8c_020,MIXb_stereo16c_020
  4348.         dc.l    MIX_stereo8s_020,MIX_stereo16s_020,MIXb_stereo8s_020,MIXb_stereo16s_020
  4349.     ENDC
  4350.  
  4351.     IFNE    SUPPORT_SMOOTH
  4352. mixs        dc.l    sMIX_mono8,sMIX_mono16,sMIXb_mono8,sMIXb_mono16
  4353.         dc.l    sMIX_stereo8,sMIX_stereo16,sMIXb_stereo8,sMIXb_stereo16
  4354.         dc.l    sMIX_stereo8l,sMIX_stereo16l,sMIXb_stereo8l,sMIXb_stereo16l
  4355.         dc.l    sMIX_stereo8r,sMIX_stereo16r,sMIXb_stereo8r,sMIXb_stereo16r
  4356.         dc.l    sMIX_stereo8c,sMIX_stereo16c,sMIXb_stereo8c,sMIXb_stereo16c
  4357.         dc.l    sMIX_stereo8,sMIX_stereo16,sMIXb_stereo8,sMIXb_stereo16
  4358.     ENDC
  4359.  
  4360.         XREF    _freq_tables
  4361.  
  4362.     IFNE    SUPPORT_SMOOTH
  4363. ; Set smoothing routines
  4364.  
  4365. ; smoothing, D0 = 0 or 1 for off or on (no other values accepted!)
  4366.  
  4367.         XDEF    _MixSmooth
  4368.  
  4369. _MixSmooth    cmp.b    m_smoothing(pc),d0
  4370.         bne.s    1$
  4371.         rts
  4372. 1$        move.b    d0,m_smoothing
  4373.         lea    mixs(pc),a0
  4374.         lea    mixr_mono(pc),a1
  4375. ; swap mixing function pointers
  4376.         moveq    #5,d0
  4377. 2$        addq.l    #8,a1
  4378.         move.l    (a0),d1
  4379.         move.l    (a1),(a0)+
  4380.         move.l    d1,(a1)+
  4381.         move.l    (a0),d1
  4382.         move.l    (a1),(a0)+
  4383.         move.l    d1,(a1)+
  4384.         move.l    (a0),d1
  4385.         move.l    (a1),(a0)+
  4386.         move.l    d1,(a1)+
  4387.         move.l    (a0),d1
  4388.         move.l    (a1),(a0)+
  4389.         move.l    d1,(a1)+
  4390.         dbra    d0,2$
  4391.         rts
  4392.     ENDC
  4393.  
  4394. ; Set 68020+ routines for mixing
  4395.  
  4396.         XDEF    _MixUse020
  4397.  
  4398. _MixUse020
  4399.     IFNE    SUPPORT_000&SUPPORT_020
  4400.         lea    mixr_020(pc),a0
  4401.         lea    mixr_skip(pc),a1
  4402.         moveq    #6,d0
  4403. 1$        addq.l    #8,a1
  4404.         move.l    (a0)+,(a1)+
  4405.         move.l    (a0)+,(a1)+
  4406.         move.l    (a0)+,(a1)+
  4407.         move.l    (a0)+,(a1)+
  4408.         dbra    d0,1$
  4409. ; --- modify code directly to use the 020 MixSample routine
  4410.         move.w    #MixSample_020-(MixS_instr+2),MixS_instr+2
  4411.         move.l    a6,-(sp)
  4412.         movea.l    4.w,a6
  4413.         jsr    -$27C(a6)    ;CacheClearU()
  4414.         move.l    (sp)+,a6
  4415.     ENDC
  4416.         rts
  4417.  
  4418. ; PlayNoteMix --- note playing
  4419. ; Registers:
  4420. ;        D7 = track number
  4421. ;        D1 = note number (BYTE)
  4422. ;        A0 = sample pointer
  4423. ;        A3 = song sample data (used in OCTAMED_INTERN)
  4424. ;        A5 = track data structure
  4425. ; Play backwards if bit #6 of trk_miscflags is set.
  4426.  
  4427.         XDEF    _PlayNoteMix
  4428.  
  4429.     IFEQ    OCTAMED_INTERN
  4430.         XREF    flags,rptrptlen
  4431.     ENDC
  4432.  
  4433. _PlayNoteMix    move.l    a2,-(sp)
  4434.         cmp.w    m_channels(pc),d7
  4435.         bhs.w    pnm_exit
  4436.         movea.l    trk_cinfo(a5),a1
  4437.         lea    _freq_tables+32,a2
  4438.         move.b    trk_finetune(a5),d0
  4439.         ext.w    d0
  4440.         add.w    d0,d0
  4441.         add.w    d0,d0
  4442.         move.l    0(a2,d0.w),a2
  4443.         move.l    a2,trk_periodtbl(a5)
  4444.         ext.w    d1    ;not > $7F anyway
  4445.         add.w    d1,d1
  4446.         move.w    0(a2,d1.w),trk_prevper(a5) ;store frequency
  4447.     IFNE    OCTAMED_INTERN
  4448.         btst    #0,45(a3)    ;SSFLG_LOOP of ss->flags?
  4449.         beq.w    pnm_noloop
  4450.         cmp.l    #2,56(a3)    ;ss->replen > 2?
  4451.         bls.w    pnm_noloop
  4452.         bset    #CHFLAGB_LOOP,ci_flags(a1)
  4453.         btst    #3,45(a3)    ;SSFLG_PINGPONG of ss->flags?
  4454.     ELSEIF
  4455.         moveq    #0,d0
  4456.         move.b    trk_previnstr(a5),d0
  4457.         lea    flags,a3
  4458.         move.b    0(a3,d0.w),d1
  4459.         lea    rptrptlen,a3
  4460.         lsl.w    #3,d0
  4461.         adda.w    d0,a3
  4462.         btst    #0,d1        ;SSFLG_LOOP?
  4463.         beq.w    pnm_noloop
  4464.         cmp.l    #2,4(a3)    ;ss->replen...
  4465.         bls.w    pnm_noloop
  4466.         bset    #CHFLAGB_LOOP,ci_flags(a1)
  4467.         btst    #3,d1        ;SSFLG_PINGPONG of ss->flags?
  4468.     ENDC
  4469.         beq.s    1$
  4470.         bset    #CHFLAGB_PINGPONG,ci_flags(a1)
  4471.         bra.s    2$
  4472. 1$        bclr    #CHFLAGB_PINGPONG,ci_flags(a1)
  4473. 2$
  4474.     IFNE    OCTAMED_INTERN
  4475.         move.l    40(a3),d0    ;ss->rep
  4476.         move.l    56(a3),d1    ;ss->replen
  4477.     ELSEIF
  4478.         move.l    (a3)+,d0
  4479.         move.l    (a3),d1
  4480.     ENDC
  4481.         move.l    d1,ci_restartoffset(a1)    ;loop length
  4482.         btst    #6,trk_miscflags(a5)
  4483.         bne.s    pnm_loopbackw
  4484. ; --- loop forwards
  4485.         add.l    d1,d0        ;sum rep + length
  4486.         move.l    d0,ci_endoffset(a1)    ;endoffset
  4487.         moveq    #0,d1
  4488.         move.w    trk_soffset(a5),d1    ;start offset
  4489.         cmp.l    d0,d1
  4490.         blo.s    3$        ;start offs < end offs (valid)
  4491.         moveq    #0,d1        ;invalid -> clear start offset
  4492. 3$        move.l    d1,ci_offset(a1)
  4493.         bclr    #CHFLAGB_BACKW,ci_flags(a1)
  4494.         bra.w    pnm_loopset
  4495. ; --- loop backwards
  4496. pnm_loopbackw
  4497.         bset    #CHFLAGB_BACKW,ci_flags(a1)
  4498.         move.l    (a0),d1        ;sample length
  4499.         btst    #4,5(a0)    ;16-bit?
  4500.         beq.s    1$
  4501.         lsr.l    #1,d1        ;/ 2, if so
  4502. 1$        subq.l    #1,d1
  4503.         move.l    d1,ci_offset(a1)
  4504.         sub.l    d0,d1
  4505.         subq.l    #1,d0
  4506.         move.l    d0,ci_endoffset(a1)    ;ss->rep
  4507.         moveq    #0,d0
  4508.         move.w    trk_soffset(a5),d0
  4509.         cmp.l    d0,d1
  4510.         bls.s    pnm_loopset    ;offs - endoffs <= trk_soffset
  4511.         sub.l    d0,ci_offset(a1)
  4512.         bra.s    pnm_loopset
  4513. ; --- no loop
  4514. pnm_noloop
  4515.         bclr    #CHFLAGB_LOOP,ci_flags(a1)
  4516.         clr.l    ci_restartoffset(a1)
  4517.         move.l    (a0),d1        ;get sample length
  4518.         btst    #4,5(a0)    ;16-bit?
  4519.         beq.s    2$
  4520.         lsr.l    #1,d1        ;/ 2
  4521. 2$        btst    #6,trk_miscflags(a5)
  4522.         beq.s    pnm_oneshotforw
  4523. ; --- one-shot, backwards
  4524.         bset    #CHFLAGB_BACKW,ci_flags(a1)
  4525.         moveq    #-1,d0
  4526.         move.l    d0,ci_endoffset(a1)
  4527.         subq.l    #1,d1
  4528.         moveq    #0,d0
  4529.         move.w    trk_soffset(a5),d0
  4530.         sub.l    d0,d1
  4531.         bpl.s    3$
  4532.         add.l    d0,d1    ;overflow.. compensate
  4533. 3$        move.l    d1,ci_offset(a1)
  4534.         bra.s    pnm_loopset
  4535. ; --- one-shot, forwards
  4536. pnm_oneshotforw
  4537.         bclr    #CHFLAGB_BACKW,ci_flags(a1)
  4538.         move.l    d1,ci_endoffset(a1)
  4539.         moveq    #0,d0
  4540.         move.w    trk_soffset(a5),d0
  4541.         cmp.l    d1,d0
  4542.         blo.s    1$
  4543.         moveq    #0,d0
  4544. 1$        move.l    d0,ci_offset(a1)
  4545. pnm_loopset
  4546. ; --- set other parameters
  4547.         clr.l    ci_newstart_addr(a1)
  4548.         lea    6(a0),a2
  4549.         move.l    a2,ci_sample_start(a1)
  4550.         btst    #5,5(a0)    ;test stereo...
  4551.         beq.s    1$        ;no stereo
  4552.         move.l    (a0),ci_rightch_offs(a1)
  4553.         bset    #CHFLAGB_STEREO,ci_flags(a1)
  4554.         bra.s    2$
  4555. 1$        bclr    #CHFLAGB_STEREO,ci_flags(a1)
  4556.         clr.l    ci_rightch_offs(a1)
  4557. 2$        bclr    #CHFLAGB_MUTED,ci_flags(a1)
  4558.         btst    #4,5(a0)    ;16-bit??
  4559.         bne.s    pnm_16bit
  4560.         bclr    #CHFLAGB_16BIT,ci_flags(a1)
  4561. pnm_exit    move.l    (sp)+,a2
  4562.         rts
  4563. pnm_16bit    bset    #CHFLAGB_16BIT,ci_flags(a1)
  4564.         move.l    (sp)+,a2
  4565.         rts
  4566.  
  4567.  
  4568.     IFNE    OCTAMED_INTERN
  4569. ; _PlayDataMix --- sample playing
  4570. ; Registers:
  4571. ;        D7 = track number
  4572. ;        D1 = frequency (UWORD)
  4573. ;        D2 = offset
  4574. ;        D3 = length
  4575. ;        D4 = loop (UBYTE, boolean)
  4576. ;        A0 = sample pointer
  4577.  
  4578.         XDEF    _PlayDataMix
  4579.  
  4580. _PlayDataMix    cmp.w    m_channels(pc),d7
  4581.         bhs.w    pdm_rts
  4582.         movem.l    a4-a5,-(sp)
  4583.         lea    trackdataptrs,a1
  4584.         move.w    d7,d0
  4585.         add.w    d0,d0
  4586.         add.w    d0,d0
  4587.         adda.w    d0,a1
  4588.         movea.l    (a1),a5
  4589.         move.w    d1,trk_prevper(a5) ;store frequency
  4590.         move.b    #64,trk_prevvol(a5)    ;full volume
  4591.         movea.l    trk_cinfo(a5),a1
  4592.         move.l    d2,ci_offset(a1)
  4593.         tst.b    d4        ;loop?
  4594.         bne.s    1$
  4595.         clr.l    ci_restartoffset(a1)    ;no
  4596.         bclr    #CHFLAGB_LOOP,ci_flags(a1)
  4597.         bra.s    2$
  4598. 1$        move.l    d3,ci_restartoffset(a1)
  4599.         bset    #CHFLAGB_LOOP,ci_flags(a1)
  4600. 2$        move.l    d2,d0
  4601.         add.l    d3,d0
  4602.         move.l    d0,ci_endoffset(a1)
  4603.         bsr.s    pdm_set
  4604.         move.w    trk_prevper(a5),d1
  4605.         bsr.w    _MixSetTrkPeriod
  4606.         moveq    #64,d0
  4607.         movea.l    _sng,a0
  4608.         movea.l    (a0),a4    ;MixSetTrkVol needs this for pan
  4609.         bsr.w    _MixSetTrkVol
  4610.         movem.l    (sp)+,a4-a5
  4611. pdm_rts        rts
  4612.  
  4613. pdm_set        move.l    a2,-(sp)
  4614.         bra.s    pnm_loopset
  4615.     ENDC
  4616.  
  4617. ; -------------------------------------------------------------------
  4618. ; SetMixTempo(sg) (a0)
  4619. ; -------------------------------------------------------------------
  4620.  
  4621.         XDEF    _SetMixTempo
  4622.  
  4623. _SetMixTempo    btst    #5,msng_flags2(a0)    ;BPM?
  4624.         beq.s    smt_nobpm
  4625.         move.l    m_actualrate(pc),d0
  4626.         move.b    msng_flags2(a0),d1
  4627.         and.w    #$1F,d1        ;BPM lpb mask
  4628.         addq.w    #1,d1
  4629.         mulu    msng_deftempo(a0),d1
  4630.     IFNE    OCTAMED_INTERN
  4631.         movea.l    _UtilityBase,a0
  4632.     ELSEIF
  4633.         movea.l    UtBase,a0
  4634.     ENDC
  4635.         jsr    -$9C(a0)    ;UDivMod32()
  4636.         move.l    d0,d1
  4637.         lsl.l    #3,d0        ;* 8
  4638.         add.l    d1,d0
  4639.         add.l    d1,d0        ;* 10
  4640.         move.l    d0,_passlength
  4641.         rts
  4642. smt_nobpm    move.l    #470000,d0
  4643.         divu    msng_deftempo(a0),d0
  4644.         mulu    m_actualrate(pc),d0
  4645.         lsr.l    #4,d0
  4646.         divu    #44336,d0
  4647.         moveq    #0,d1
  4648.         movem.w    d0/d1,_passlength
  4649.         rts
  4650.  
  4651. ; -------------------------------------------------------------------
  4652. ; Variables
  4653. ; -------------------------------------------------------------------
  4654.  
  4655. ; This routine copies the variables defined in C-source to here
  4656. ; for local access.
  4657.  
  4658.         XDEF    _SetMixVars
  4659.     IFNE    OCTAMED_INTERN
  4660.         XREF    _sng
  4661.         XREF    _m_swapchan
  4662.     ELSEIF
  4663.         XREF    _sng_struct
  4664.     ENDC
  4665.         XREF    _mix_channels,maxaudiotrk
  4666.         XREF    _actualrate_hz,_actualrate_fract
  4667.         XREF    trackdataptrs
  4668. _SetMixVars    move.w    _mix_channels,d0
  4669.         move.w    d0,m_channels
  4670.         move.w    d0,maxaudiotrk
  4671.     IFNE    OCTAMED_INTERN
  4672.         movea.l    _sng,a0
  4673.         movea.l    (a0),a0
  4674.         move.b    msng_m_stereo(a0),m_stereo
  4675.     ELSEIF
  4676.         movea.l    _sng_struct,a0
  4677.         move.l    528(a0),d1    ;flags3 in MMD2song
  4678.         btst    #0,d1
  4679.         sne    m_stereo
  4680.     ENDC
  4681.         move.b    msng_m_echo(a0),m_echo
  4682.         move.b    msng_m_echodep(a0),m_echodepth
  4683.         move.w    _actualrate_hz,m_actualrate
  4684.         move.w    _actualrate_fract,m_actualrfract
  4685. ; --- set trk_cinfo field of track data structures
  4686.         move.l    _chinfo,d1
  4687.         lea    trackdataptrs,a0
  4688.         subq.w    #1,d0
  4689.         bmi.s    smv_rts
  4690. 1$        movea.l    (a0)+,a1
  4691.         move.l    d1,trk_cinfo(a1)
  4692.         add.l    #ci_sizeof,d1
  4693.         dbra    d0,1$
  4694. smv_rts        rts
  4695.         
  4696. ; Local variables:
  4697. m_channels    ds.w    1
  4698. m_stereo    ds.b    1
  4699. m_echo        ds.b    1
  4700. m_echodepth    ds.b    1
  4701. m_smoothing    ds.b    1
  4702. m_actualrate    dc.w    1    ;\ keep together
  4703. m_actualrfract    ds.w    1    ;/
  4704. m_whichbuff    ds.w    1
  4705. m_destbuff    ds.l    4
  4706.  
  4707. ; -------------------------------------------------------------------
  4708. ; Audio Interrupts (Amiga audio output)
  4709. ; -------------------------------------------------------------------
  4710.  
  4711.         XREF    _chipbuff
  4712.  
  4713. AudI8m        move.w    #$80,$9C(a0)    ;clear AUD0 of INTREQ
  4714.         not.b    m_whichbuff-AudI8m(a5)
  4715.         beq.s    1$    ;use audio buffer #1
  4716.         addq.l    #4,a1    ;use audio buffer #2
  4717. 1$        move.l    (a1),d0
  4718.         move.l    d0,$A0(a0)    ;set ac_ptr
  4719.         move.l    d0,$B0(a0)
  4720.         move.l    d0,$C0(a0)
  4721.         move.l    d0,$D0(a0)
  4722.         move.l    d0,m_destbuff-AudI8m(a5)
  4723.         lea    mixsint(pc),a1
  4724.         jmp    -$B4(a6)    ;Cause()
  4725.  
  4726. AudSI8m        move.l    a2,-(sp)
  4727.         move.l    (a1),a2        ;mixbuff
  4728.         bsr.w    _BuffFillPass
  4729.         movea.l    m_destbuff-AudSI8m(a5),a0
  4730.         move.l    _buffsize,d0
  4731.         lsr.w    #1,d0
  4732.         subq.w    #1,d0
  4733. 1$        move.w    (a2)+,d1
  4734.         move.b    (a2),d1
  4735.         addq.l    #2,a2
  4736.         move.w    d1,(a0)+
  4737.         dbra    d0,1$
  4738.         move.l    (sp)+,a2
  4739.         rts
  4740.  
  4741. AudI14m        move.w    #$80,$9C(a0)    ;clear AUD0 of INTREQ
  4742.         not.b    m_whichbuff-AudI14m(a5)
  4743.         beq.s    1$    ;use audio buffer #1
  4744.         addq.l    #8,a1    ;use audio buffer #2
  4745. 1$        move.l    (a1)+,d0
  4746.         move.l    d0,$A0(a0)    ;set ac_ptr
  4747.         move.l    d0,$B0(a0)
  4748.         move.l    (a1),d1
  4749.         move.l    d1,$C0(a0)
  4750.         move.l    d1,$D0(a0)
  4751.         movem.l    d0/d1,m_destbuff-AudI14m(a5)
  4752.         lea    mixsint(pc),a1
  4753.         jmp    -$B4(a6)    ;Cause()
  4754.  
  4755. AudSI14m    move.l    a2,-(sp)
  4756.         move.l    (a1),a2        ;mixbuff
  4757.         bsr.w    _BuffFillPass
  4758.         movem.l    m_destbuff-AudSI14m(a5),a0/a1
  4759.         move.l    _buffsize,d0
  4760.         lsr.w    #1,d0
  4761.         subq.w    #1,d0
  4762.         move.l    d2,a5
  4763. 1$        move.w    (a2)+,d1
  4764.         moveq    #0,d2
  4765.         move.b    d1,d2
  4766.         move.b    (a2)+,d1
  4767.         move.w    d1,(a0)+
  4768.         lsl.w    #6,d2
  4769.         move.b    (a2)+,d2
  4770.         lsr.b    #2,d2
  4771.         move.w    d2,(a1)+
  4772.         dbra    d0,1$
  4773.         move.l    a5,d2
  4774.         move.l    (sp)+,a2
  4775.         rts
  4776.  
  4777. AudI8s        move.w    #$80,$9C(a0)    ;clear AUD0 of INTREQ
  4778.         not.b    m_whichbuff-AudI8s(a5)
  4779.         beq.s    1$    ;use audio buffer #1
  4780.         addq.l    #8,a1    ;use audio buffer #2
  4781. 1$        movem.l    (a1)+,d0/d1
  4782.         movem.l    d0/d1,m_destbuff-AudI8s(a5)
  4783.     IFNE    OCTAMED_INTERN
  4784.         tst.b    _m_swapchan
  4785.         beq.s    2$
  4786.         exg    d0,d1
  4787. 2$
  4788.     ENDC
  4789.         move.l    d1,$A0(a0)    ;set ac_ptr
  4790.         move.l    d0,$B0(a0)
  4791.         move.l    d0,$C0(a0)
  4792.         move.l    d1,$D0(a0)
  4793.         lea    mixsint(pc),a1
  4794.         jmp    -$B4(a6)    ;Cause()
  4795.  
  4796. AudSI8s        move.l    a2,-(sp)
  4797.         move.l    (a1),a2        ;mixbuff
  4798.         bsr.w    _BuffFillPass
  4799.         movem.l    m_destbuff-AudSI8s(a5),a0/a1
  4800.         move.l    _buffsize,d0
  4801.         lsr.w    #1,d0
  4802.         subq.w    #1,d0
  4803. 1$        move.w    (a2)+,d1
  4804.         move.b    2(a2),d1
  4805.         move.w    d1,(a0)+
  4806.         move.w    (a2),d1
  4807.         move.b    4(a2),d1
  4808.         move.w    d1,(a1)+
  4809.         addq.l    #6,a2
  4810.         dbra    d0,1$
  4811.         move.l    (sp)+,a2
  4812.         rts
  4813.  
  4814. AudI14s        move.w    #$80,$9C(a0)    ;clear AUD0 of INTREQ
  4815.         not.b    m_whichbuff-AudI14s(a5)
  4816.         beq.s    1$        ;use audio buffer #1
  4817.         lea    16(a1),a1    ;use audio buffer #2
  4818. 1$        movem.l    (a1)+,d0/d1
  4819.         movem.l    d0/d1,m_destbuff-AudI14s(a5)
  4820.     IFNE    OCTAMED_INTERN
  4821.         tst.b    _m_swapchan
  4822.         bne.s    2$
  4823.     ENDC
  4824.         move.l    d0,$B0(a0)    ;set ac_ptr
  4825.         move.l    d1,$C0(a0)
  4826.         movem.l    (a1)+,d0/d1
  4827.         movem.l    d0/d1,m_destbuff+8-AudI14s(a5)
  4828.         move.l    d0,$A0(a0)
  4829.         move.l    d1,$D0(a0)
  4830.         lea    mixsint(pc),a1
  4831.         jmp    -$B4(a6)    ;Cause()
  4832.     IFNE    OCTAMED_INTERN
  4833. 2$        move.l    d0,$A0(a0)
  4834.         move.l    d1,$D0(a0)
  4835.         movem.l    (a1)+,d0/d1
  4836.         movem.l    d0/d1,m_destbuff+8-AudI14s(a5)
  4837.         move.l    d0,$B0(a0)    ;set ac_ptr
  4838.         move.l    d1,$C0(a0)
  4839.         lea    mixsint(pc),a1
  4840.         jmp    -$B4(a6)    ;Cause()
  4841.     ENDC
  4842.  
  4843. AudSI14s    movem.l    a2/a3/d2/d3,-(sp)
  4844.         move.l    (a1),a2        ;mixbuff
  4845.         bsr.w    _BuffFillPass
  4846.         movem.l    m_destbuff-AudSI14s(a5),a0/a1/a3/a5
  4847.         move.l    _buffsize,d0
  4848.         lsr.w    #1,d0
  4849.         subq.w    #1,d0
  4850. 1$        move.w    (a2)+,d1
  4851.         move.b    d1,d3
  4852.         move.w    (a2)+,d2
  4853.         move.b    (a2)+,d1
  4854.         move.w    d1,(a0)+
  4855.         moveq    #0,d1
  4856.         move.b    d3,d1
  4857.         lsl.w    #6,d1
  4858.         move.b    (a2)+,d1
  4859.         lsr.b    #2,d1
  4860.         move.w    d1,(a1)+
  4861.         move.w    d2,d1
  4862.         move.b    (a2)+,d1
  4863.         move.w    d1,(a3)+
  4864.         moveq    #0,d1
  4865.         move.b    d2,d1
  4866.         lsl.w    #6,d1
  4867.         move.b    (a2)+,d1
  4868.         lsr.b    #2,d1
  4869.         move.w    d1,(a5)+
  4870.         dbra    d0,1$
  4871.         movem.l    (sp)+,a2/a3/d2/d3
  4872.         rts
  4873.  
  4874. ; -------------------------------------------------------------------
  4875. ; StartAmigaMix(14bit) (d2)
  4876. ; -------------------------------------------------------------------
  4877.  
  4878.         XREF    _mixbuff
  4879.         XDEF    _StartAmigaMix
  4880.  
  4881. _StartAmigaMix    move.l    a6,-(sp)
  4882.         tst.w    d2
  4883.         beq.s    sam_8bit
  4884.         tst.b    m_stereo
  4885.         bne.s    sam_stereo14
  4886.         lea    AudI14m(pc),a0
  4887.         lea    AudSI14m(pc),a1
  4888.         bra.s    sam_setintr
  4889. sam_stereo14    lea    AudI14s(pc),a0
  4890.         lea    AudSI14s(pc),a1
  4891.         bra.s    sam_setintr
  4892. sam_8bit    tst.b    m_stereo
  4893.         bne.s    sam_stereo
  4894.         lea    AudI8m(pc),a0
  4895.         lea    AudSI8m(pc),a1
  4896.         bra.s    sam_setintr
  4897. sam_stereo    lea    AudI8s(pc),a0
  4898.         lea    AudSI8s(pc),a1
  4899. sam_setintr    move.l    a0,mixintr
  4900.         move.l    a1,mixsintr
  4901.         clr.b    m_whichbuff
  4902.         moveq    #7,d0        ;INTB_AUD0
  4903.         lea    mixint(pc),a1
  4904.         movea.l    4.w,a6
  4905.         jsr    -$A2(a6)    ;SetIntVector
  4906.         lea    _chipbuff,a1
  4907.         lea    $dff000,a0
  4908.         tst.w    d2
  4909.         beq.s    sam_8bit2
  4910.         tst.b    m_stereo
  4911.         beq.s    sam_nostereo1
  4912.     IFNE    OCTAMED_INTERN
  4913.         tst.b    _m_swapchan
  4914.         bne.s    1$
  4915.     ENDC
  4916.         move.l    (a1)+,$B0(a0)
  4917.         move.l    (a1)+,$C0(a0)
  4918.         move.l    (a1)+,$A0(a0)
  4919.         move.l    (a1)+,$D0(a0)
  4920.         bra.s    sam_startdma
  4921.     IFNE    OCTAMED_INTERN
  4922. 1$        move.l    (a1)+,$A0(a0)
  4923.         move.l    (a1)+,$D0(a0)
  4924.         move.l    (a1)+,$B0(a0)
  4925.         move.l    (a1)+,$C0(a0)
  4926.         bra.s    sam_startdma
  4927.     ENDC
  4928. sam_nostereo1    move.l    (a1)+,d0
  4929.         move.l    d0,$B0(a0)
  4930.         move.l    d0,$A0(a0)
  4931.         move.l    (a1),d0
  4932.         move.l    d0,$D0(a0)
  4933.         move.l    d0,$C0(a0)
  4934.         bra.s    sam_startdma
  4935. sam_8bit2    move.l    (a1)+,d0    ;chipbuff (1)
  4936.         move.l    d0,$B0(a0)    ;to ac_ptr[1]
  4937.         move.l    d0,$C0(a0)
  4938.         tst.b    m_stereo
  4939.         beq.s    sam_nostereo2
  4940.     IFNE    OCTAMED_INTERN
  4941.         tst.b    _m_swapchan
  4942.         beq.s    1$
  4943.         move.l    d0,$A0(a0)
  4944.         move.l    d0,$D0(a0)
  4945.         move.l    (a1),d0
  4946.         move.l    d0,$B0(a0)
  4947.         move.l    d0,$C0(a0)
  4948.         bra.s    sam_startdma
  4949. 1$
  4950.     ENDC
  4951.         move.l    (a1),d0        ;chipbuff (2)
  4952. sam_nostereo2    move.l    d0,$A0(a0)    ;ac_ptr[0]
  4953.         move.l    d0,$D0(a0)
  4954. sam_startdma    move.w    #$8080,$9A(a0)    ;INTENA
  4955.         move.w    #$0080,$9C(a0)    ;INTREQ (avoids spurious interrupt when turning DMA on)
  4956.         move.w    #$800F,$96(a0)    ;DMACON
  4957.         move.l    (sp)+,a6
  4958.         rts
  4959.  
  4960.  
  4961. mixintname    dc.b    'OctaMED Mixing Interrupt',0
  4962.         EVEN
  4963. mixint        ds.w    5
  4964.         dc.l    mixintname,_chipbuff
  4965. mixintr        dc.l    AudI8m
  4966. mixsintname    dc.b    'OctaMED Mixing SoftInt',0
  4967.         EVEN
  4968. mixsint        ds.w    5
  4969.         dc.l    mixsintname,_mixbuff
  4970. mixsintr    dc.l    AudSI8m
  4971.  
  4972. ; -------------------------------------------------------------------
  4973. ; BuffFillPass(WORD *mix_dest) (a2)
  4974. ; -------------------------------------------------------------------
  4975.  
  4976. ; Fills the mix buffer (calling IntHandler and mixing routines as
  4977. ; required).
  4978.  
  4979.         XREF    _IntHandler
  4980.         XDEF    _BuffFillPass
  4981.  
  4982. _BuffFillPass    movem.l    a2/d2-d5,-(sp)
  4983.         movem.w    _currleft(pc),d3/d5
  4984.         move.l    _buffsize,d4    ;fillleft
  4985. ; --- clear destination buffer
  4986.         move.w    d4,d0
  4987.         movea.l    a2,a0
  4988.         tst.b    m_stereo
  4989.         bne.s    2$
  4990.         lsr.w    #1,d0
  4991.         bcc.s    2$
  4992.         clr.w    (a0)+
  4993. 1$        clr.l    (a0)+
  4994. 2$        dbra    d0,1$
  4995. ; --- loop
  4996. bfp_loop    tst.l    d4
  4997.         beq.s    bfp_exit
  4998.         tst.w    d3
  4999.         beq.s    bfp_nomix
  5000.         cmp.l    d3,d4        ;min(currleft,fillleft)
  5001.         bls.s    1$
  5002.         move.l    d3,d2
  5003.         bra.s    2$
  5004. 1$        move.l    d4,d2
  5005. 2$        movea.l    a2,a1
  5006.         sub.w    d2,d3
  5007.         sub.l    d2,d4
  5008. MixS_instr
  5009.     IFNE    SUPPORT_000
  5010.         bsr.w    MixSample    ;will be modified for 020+
  5011.     ELSEIF
  5012.         bsr.w    MixSample_020
  5013.     ENDC
  5014.         tst.b    m_stereo
  5015.         beq.s    bfp_mono
  5016.         add.l    d2,d2
  5017. bfp_mono    add.l    d2,d2
  5018.         add.l    d2,a2
  5019. bfp_nomix    tst.w    d3
  5020.         bne.s    bfp_loop
  5021.         jsr    _IntHandler(pc)
  5022.         move.w    _passlength(pc),d3
  5023.         add.w    _passfract(pc),d5
  5024.         bcc.s    bfp_loop
  5025.         addq.w    #1,d3
  5026.         bra.s    bfp_loop
  5027. bfp_exit    movem.w    d3/d5,_currleft    ;store back
  5028.         movem.l    (sp)+,a2/d2-d5
  5029.         tst.b    m_echo
  5030.         beq.s    bfp_noecho
  5031.         movea.l    a2,a0
  5032.         bsr.s    _Fx_Echo
  5033. bfp_noecho
  5034.     IFNE    OCTAMED_INTERN
  5035.         movea.l    _sng,a0
  5036.         movea.l    (a0),a0
  5037.         move.b    msng_m_stsep(a0),d1
  5038.         beq.s    bfp_rts
  5039.         tst.b    msng_m_stereo(a0)
  5040.         beq.s    bfp_rts
  5041.     ELSEIF
  5042.         movea.l    _sng_struct,a0
  5043.         move.b    540(a0),d1    ;stereosep
  5044.         beq.s    bfp_rts
  5045.         btst    #0,531(a0)    ;flags3 (last byte) (STEREO flag)
  5046.         beq.s    bfp_rts
  5047.     ENDC
  5048.         movea.l    a2,a0
  5049.         bra.w    _Fx_StereoSep
  5050. bfp_rts        rts
  5051.  
  5052. ; Variables for buffer filling.
  5053.  
  5054.         XDEF    _currleft,_currleftfract
  5055.         XDEF    _passlength,_passfract
  5056. _currleft    dc.w    0    ;\ don't change ordering
  5057. _currleftfract    dc.w    0    ;/
  5058. _passlength    dc.w    0    ;\ here too
  5059. _passfract    dc.w    0    ;/
  5060.  
  5061. ; -------------------------------------------------------------------
  5062. ; _Fx_Echo(WORD *mixbuff) (a0)
  5063. ; -------------------------------------------------------------------
  5064.         XDEF    _Fx_Echo
  5065.         XREF    _echobuffer    ;(WORD *)
  5066.         XREF    _echord        ;(LONG)
  5067.         XREF    _echobuffsz    ;(LONG)
  5068.  
  5069. _Fx_Echo    movem.l    d2-d6/a2,-(sp)
  5070.         move.l    _echobuffer,d0
  5071.         beq.w    fxec_return
  5072.         move.l    d0,a2        ;a2 = echobuffer (start)
  5073.         moveq    #0,d2        ;d2 = copied samples
  5074.         move.l    _buffsize,d3    ;d3 = mix buffer size
  5075.         move.l    _echord,d4    ;d4 = echobuffer position
  5076.         move.l    _echobuffsz,d5    ;d5 = echobuffer size
  5077.         move.b    m_echodepth(pc),d6    ;d6 = echo shift cnt
  5078.         tst.b    m_stereo
  5079.         beq.w    fxec_mono
  5080.         cmp.b    #2,m_echo
  5081.         beq.w    fxec_crossecho
  5082. ; --- STEREO, NORMAL ECHO
  5083. fxec_loop1    cmp.l    d3,d2        ;copied >= buffsize?
  5084.         bhs.w    fxec_return
  5085.         cmp.l    d5,d4        ;echord >= echobuffsz?
  5086.         blo.s    1$
  5087.         moveq    #0,d4        ;if so, echord = 0
  5088. 1$        move.l    d3,d0        ;buffsize...
  5089.         sub.l    d2,d0        ; - copied
  5090.         move.l    d5,d1        ;echobuffsz
  5091.         sub.l    d4,d1        ; - echord
  5092.         cmp.l    d1,d0        ;d0 > d1?
  5093.         bhs.s    2$        ;yes, lower # in d1
  5094.         move.l    d0,d1        ;move lower to d1 => copylen
  5095. 2$        move.l    d4,d0        ;echord
  5096.         add.l    d0,d0
  5097.         add.l    d0,d0        ; *= 4..
  5098.         lea    0(a2,d0.l),a1    ;a1 = echo buffer pointer
  5099.         add.l    d1,d2        ;copied += copylen
  5100.         add.l    d1,d4        ;echord += copylen
  5101.         lsr.l    #1,d1
  5102.         bcc.s    4$
  5103.         move.w    (a1),d0
  5104.         asr.w    d6,d0
  5105.         add.w    d0,(a0)
  5106.         move.w    (a0)+,(a1)+
  5107.         move.w    (a1),d0
  5108.         asr.w    d6,d0
  5109.         add.w    d0,(a0)
  5110.         move.w    (a0)+,(a1)+
  5111. 4$        lsr.l    #1,d1
  5112.         bcs.s    5$
  5113. ; --- echo loop
  5114. 3$        subq.l    #1,d1        ;copylen--
  5115.         bmi.s    fxec_loop1    ;end of copy
  5116.         move.w    (a1),d0        ;get word from echo buffer
  5117.         asr.w    d6,d0        ;shift...
  5118.         add.w    d0,(a0)        ;add to mix buffer
  5119.         move.w    (a0)+,(a1)+    ;mix buffer -> echo buffer
  5120.         move.w    (a1),d0        ;the same for the right ch.
  5121.         asr.w    d6,d0
  5122.         add.w    d0,(a0)
  5123.         move.w    (a0)+,(a1)+
  5124. ; --- 3 times more
  5125.         move.w    (a1),d0
  5126.         asr.w    d6,d0
  5127.         add.w    d0,(a0)
  5128.         move.w    (a0)+,(a1)+
  5129.         move.w    (a1),d0
  5130.         asr.w    d6,d0
  5131.         add.w    d0,(a0)
  5132.         move.w    (a0)+,(a1)+
  5133. 5$        move.w    (a1),d0
  5134.         asr.w    d6,d0
  5135.         add.w    d0,(a0)
  5136.         move.w    (a0)+,(a1)+
  5137.         move.w    (a1),d0
  5138.         asr.w    d6,d0
  5139.         add.w    d0,(a0)
  5140.         move.w    (a0)+,(a1)+
  5141.         move.w    (a1),d0
  5142.         asr.w    d6,d0
  5143.         add.w    d0,(a0)
  5144.         move.w    (a0)+,(a1)+
  5145.         move.w    (a1),d0
  5146.         asr.w    d6,d0
  5147.         add.w    d0,(a0)
  5148.         move.w    (a0)+,(a1)+
  5149.         bra.s    3$
  5150. fxec_return    move.l    d4,_echord    ;store...
  5151.         movem.l    (sp)+,d2-d6/a2
  5152.         rts
  5153. fxec_crossecho
  5154. ; --- STEREO, CROSS ECHO (additive)
  5155. fxec_loop2    cmp.l    d3,d2        ;copied >= buffsize?
  5156.         bhs.s    fxec_return
  5157.         cmp.l    d5,d4        ;echord >= echobuffsz?
  5158.         blo.s    1$
  5159.         moveq    #0,d4        ;if so, echord = 0
  5160. 1$        move.l    d3,d0        ;buffsize...
  5161.         sub.l    d2,d0        ; - copied
  5162.         move.l    d5,d1        ;echobuffsz
  5163.         sub.l    d4,d1        ; - echord
  5164.         cmp.l    d1,d0        ;d0 > d1?
  5165.         bhs.s    2$        ;yes, lower # in d1
  5166.         move.l    d0,d1        ;move lower to d1 => copylen
  5167. 2$        move.l    d4,d0        ;echord
  5168.         add.l    d0,d0
  5169.         add.l    d0,d0        ; *= 4..
  5170.         lea    0(a2,d0.l),a1    ;a1 = echo buffer pointer
  5171.         add.l    d1,d2        ;copied += copylen
  5172.         add.l    d1,d4        ;echord += copylen
  5173.         lsr.l    #1,d1
  5174.         bcc.s    4$
  5175.         move.w    2(a1),d0
  5176.         asr.w    d6,d0
  5177.         add.w    d0,(a0)
  5178.         move.w    (a1),d0
  5179.         asr.w    d6,d0
  5180.         add.w    d0,2(a0)
  5181.         move.l    (a0)+,(a1)+
  5182. 4$        lsr.l    #1,d1
  5183.         bcs.s    5$
  5184. ; --- echo loop
  5185. 3$        subq.l    #1,d1        ;copylen--
  5186.         bmi.s    fxec_loop2    ;end of copy
  5187.         move.w    2(a1),d0    ;get word from right ch
  5188.         asr.w    d6,d0        ;and shift...
  5189.         add.w    d0,(a0)        ;add to left ch
  5190.         move.w    (a1),d0        ;get left ch echo
  5191.         asr.w    d6,d0
  5192.         add.w    d0,2(a0)    ;add to right ch
  5193.         move.l    (a0)+,(a1)+    ;copy the lw to echo buffer
  5194.         move.w    2(a1),d0
  5195.         asr.w    d6,d0
  5196.         add.w    d0,(a0)
  5197.         move.w    (a1),d0
  5198.         asr.w    d6,d0
  5199.         add.w    d0,2(a0)
  5200.         move.l    (a0)+,(a1)+
  5201. 5$        move.w    2(a1),d0
  5202.         asr.w    d6,d0
  5203.         add.w    d0,(a0)
  5204.         move.w    (a1),d0
  5205.         asr.w    d6,d0
  5206.         add.w    d0,2(a0)
  5207.         move.l    (a0)+,(a1)+
  5208.         move.w    2(a1),d0
  5209.         asr.w    d6,d0
  5210.         add.w    d0,(a0)
  5211.         move.w    (a1),d0
  5212.         asr.w    d6,d0
  5213.         add.w    d0,2(a0)
  5214.         move.l    (a0)+,(a1)+
  5215.         bra.s    3$
  5216. fxec_mono
  5217. ; --- MONO
  5218. fxec_loop3    cmp.l    d3,d2        ;copied >= buffsize?
  5219.         bhs.w    fxec_return
  5220.         cmp.l    d5,d4        ;echord >= echobuffsz?
  5221.         blo.s    1$
  5222.         moveq    #0,d4        ;if so, echord = 0
  5223. 1$        move.l    d3,d0        ;buffsize...
  5224.         sub.l    d2,d0        ; - copied
  5225.         move.l    d5,d1        ;echobuffsz
  5226.         sub.l    d4,d1        ; - echord
  5227.         cmp.l    d1,d0        ;d0 > d1?
  5228.         bhs.s    2$        ;yes, lower # in d1
  5229.         move.l    d0,d1        ;move lower to d1 => copylen
  5230. 2$        lea    0(a2,d4.l),a1    ;a1 = echo buffer pointer
  5231.         add.l    d4,a1        ;(index *= 2)
  5232.         add.l    d1,d2        ;copied += copylen
  5233.         add.l    d1,d4        ;echord += copylen
  5234.         lsr.l    #1,d1
  5235.         bcc.s    4$
  5236.         move.w    (a1),d0
  5237.         asr.w    d6,d0
  5238.         add.w    d0,(a0)
  5239.         move.w    (a0)+,(a1)+
  5240. 4$        lsr.l    #1,d1
  5241.         bcs.s    5$
  5242. ; --- echo loop
  5243. 3$        subq.l    #1,d1        ;copylen--
  5244.         bmi.s    fxec_loop3    ;end of copy
  5245.         move.w    (a1),d0        ;get word from echo buffer
  5246.         asr.w    d6,d0        ;shift...
  5247.         add.w    d0,(a0)        ;add to mix buffer
  5248.         move.w    (a0)+,(a1)+    ;mix buffer -> echo buffer
  5249.         move.w    (a1),d0
  5250.         asr.w    d6,d0
  5251.         add.w    d0,(a0)
  5252.         move.w    (a0)+,(a1)+
  5253. 5$        move.w    (a1),d0
  5254.         asr.w    d6,d0
  5255.         add.w    d0,(a0)
  5256.         move.w    (a0)+,(a1)+
  5257.         move.w    (a1),d0
  5258.         asr.w    d6,d0
  5259.         add.w    d0,(a0)
  5260.         move.w    (a0)+,(a1)+
  5261.         bra.s    3$
  5262.  
  5263.  
  5264.  
  5265.  
  5266. ; -------------------------------------------------------------------
  5267. ; _Fx_StereoSep(WORD stereosep,WORD *mixbuff) (d1, a0)
  5268. ; -------------------------------------------------------------------
  5269.  
  5270. _Fx_StereoSep:    movem.l    d2/d3,-(sp)
  5271.         move.l    _buffsize,d0
  5272.         tst.b    d1
  5273.         blt.s    fxss_neg
  5274.         moveq    #5,d2
  5275.         sub.b    d1,d2    ;d2 = shift counter
  5276.         lsr.w    #1,d0
  5277.         bcc.s    fxss_even
  5278.         move.w    (a0),d1
  5279.         move.w    2(a0),d3
  5280.         asr.w    d2,d3
  5281.         sub.w    d3,(a0)+
  5282.         asr.w    d2,d1
  5283.         sub.w    d1,(a0)+
  5284. fxss_even    lsr.w    #1,d0
  5285.         bcc.s    3$        ;length divisible by 4
  5286.         bra.s    2$        ;copy 2 samples first
  5287. 1$        move.w    (a0),d1        ;left sample
  5288.         move.w    2(a0),d3    ;right sample
  5289.         asr.w    d2,d3        ;shift...
  5290.         sub.w    d3,(a0)+    ;sub from left
  5291.         asr.w    d2,d1
  5292.         sub.w    d1,(a0)+    ;sub from right
  5293. ; --- loop rolled out four times
  5294.         move.w    (a0),d1
  5295.         move.w    2(a0),d3
  5296.         asr.w    d2,d3
  5297.         sub.w    d3,(a0)+
  5298.         asr.w    d2,d1
  5299.         sub.w    d1,(a0)+
  5300. 2$        move.w    (a0),d1
  5301.         move.w    2(a0),d3
  5302.         asr.w    d2,d3
  5303.         sub.w    d3,(a0)+
  5304.         asr.w    d2,d1
  5305.         sub.w    d1,(a0)+
  5306.         move.w    (a0),d1
  5307.         move.w    2(a0),d3
  5308.         asr.w    d2,d3
  5309.         sub.w    d3,(a0)+
  5310.         asr.w    d2,d1
  5311.         sub.w    d1,(a0)+
  5312. 3$        dbra    d0,1$
  5313.         movem.l    (sp)+,d2/d3
  5314.         rts
  5315. fxss_neg    addq.b    #5,d1    ;d1 = shift counter
  5316.         lsr.w    #1,d0
  5317.         bcc.s    fxss_even2
  5318.         move.w    (a0),d2
  5319.         move.w    2(a0),d3
  5320.         asr.w    d1,d3
  5321.         add.w    d3,(a0)+
  5322.         asr.w    d1,d2
  5323.         add.w    d2,(a0)+
  5324. fxss_even2    lsr.w    #1,d0
  5325.         bcc.s    3$
  5326.         bra.s    2$
  5327. 1$        move.w    (a0),d2        ;left sample
  5328.         move.w    2(a0),d3    ;right sample
  5329.         asr.w    d1,d3        ;shift...
  5330.         add.w    d3,(a0)+    ;add to left
  5331.         asr.w    d1,d2
  5332.         add.w    d2,(a0)+    ;add to right
  5333. ; --- rolled out
  5334.         move.w    (a0),d2
  5335.         move.w    2(a0),d3
  5336.         asr.w    d1,d3
  5337.         add.w    d3,(a0)+
  5338.         asr.w    d1,d2
  5339.         add.w    d2,(a0)+
  5340. 2$        move.w    (a0),d2
  5341.         move.w    2(a0),d3
  5342.         asr.w    d1,d3
  5343.         add.w    d3,(a0)+
  5344.         asr.w    d1,d2
  5345.         add.w    d2,(a0)+
  5346.         move.w    (a0),d2
  5347.         move.w    2(a0),d3
  5348.         asr.w    d1,d3
  5349.         add.w    d3,(a0)+
  5350.         asr.w    d1,d2
  5351.         add.w    d2,(a0)+
  5352. 3$        dbra    d0,1$
  5353.         movem.l    (sp)+,d2/d3
  5354.         rts
  5355.  
  5356.  
  5357. ; -------------------------------------------------------------------
  5358. ; Effect handling (called by the player code)
  5359. ; -------------------------------------------------------------------
  5360.  
  5361.         XDEF    Mix_FX20,Mix_FX2E,Mix_FX2F
  5362.  
  5363. ; -------------------------------------------------------------------
  5364. ; Effect 20: change sample position
  5365. ;    D0 = position change (pos or neg), D7 = track number
  5366. ;    A5 = track data structure
  5367. ; -------------------------------------------------------------------
  5368.  
  5369. Mix_FX20    cmp.w    m_channels(pc),d7
  5370.         bhs.s    mfx20_exit
  5371.         movea.l    trk_cinfo(a5),a0
  5372.         move.l    ci_offset(a0),d1
  5373.         asl.w    #8,d0
  5374.         ext.l    d0
  5375.         add.l    d0,d1
  5376.         bmi.s    mfx20_exit    ;may not become negative
  5377.         cmp.l    ci_endoffset(a0),d1
  5378.         bhs.s    mfx20_exit    ;nor exceed sample end
  5379.         move.l    d1,ci_offset(a0)
  5380. mfx20_exit    rts
  5381.  
  5382. ; -------------------------------------------------------------------
  5383. ; Effect 2E: panpot
  5384. ;    D4 = pan position (-16 - +16)
  5385. ;    A5 = track data structure
  5386. ;    A4 = song structure
  5387. ; -------------------------------------------------------------------
  5388.  
  5389.     IFNE    OCTAMED_INTERN
  5390.         XREF    _needrefresh
  5391.     ENDC
  5392.  
  5393. Mix_FX2E    cmp.w    m_channels(pc),d7
  5394.         bhs.s    mfx2e_exit
  5395.         cmp.b    #-16,d4
  5396.         blt.s    mfx2e_exit
  5397.         cmp.b    #16,d4
  5398.         bgt.s    mfx2e_exit
  5399.     IFNE    OCTAMED_INTERN
  5400.         lea    msng_trkpan(a4),a0
  5401.     ELSEIF
  5402.         move.l    msng_trkpan(a4),d1
  5403.         beq.s    mfx2e_exit
  5404.         movea.l    d1,a0
  5405.     ENDC
  5406.         move.b    d4,0(a0,d7.w)
  5407.     IFNE    OCTAMED_INTERN
  5408.         or.w    #$1000,_needrefresh+2    ;track pan refresh
  5409.     ENDC
  5410. mfx2e_exit    rts
  5411.  
  5412. ; -------------------------------------------------------------------
  5413. ; Effect 2F: effect settings
  5414. ;    D4 = settings data
  5415. ;        $Ex (x = 6 - 1) -> echo depth
  5416. ;        $Dx (x = C - 0 - 4) -> stereo separation
  5417. ;    A4 = song struct, A5 = track data structure
  5418. ; -------------------------------------------------------------------
  5419.  
  5420. Mix_FX2F    move.b    d4,d0
  5421.         and.b    #$F0,d0
  5422.         and.w    #$000F,d4
  5423.         cmp.b    #$E0,d0
  5424.         bne.s    mfx2f_noEx
  5425.         moveq    #7,d0
  5426.         sub.b    d4,d0
  5427.         ble.s    mfx2f_exit    ;< 1
  5428.         cmp.b    #6,d0
  5429.         bgt.s    mfx2f_exit    ;> 6
  5430.         move.b    d0,m_echodepth
  5431.         move.b    d0,msng_m_echodep(a4)
  5432.         bra.s    mfx2f_upd
  5433. mfx2f_noEx    cmp.b    #$D0,d0
  5434.         bne.s    mfx2f_exit
  5435.         btst    #3,d4
  5436.         beq.s    1$
  5437.         or.w    #$FFF0,d4    ;negative
  5438. 1$        cmp.w    #4,d4
  5439.         bgt.s    mfx2f_exit
  5440.         cmp.w    #-4,d4
  5441.         blt.s    mfx2f_exit
  5442.         move.b    d4,msng_m_stsep(a4)
  5443. mfx2f_upd
  5444.     IFNE    OCTAMED_INTERN
  5445.         or.w    #$2000,_needrefresh+2
  5446.     ENDC
  5447. mfx2f_exit    rts
  5448.  
  5449.  
  5450. ; -------------------------------------------------------------------
  5451. ; Fill a frequency table
  5452. ; -------------------------------------------------------------------
  5453. ; A0 = destination pointer (table size = 6 * 12 UWORDs)
  5454. ; D0 = base (C-1) frequency * 65536
  5455. ; D1 = ratio of successive notes * 65536
  5456.  
  5457.         XDEF    _FillFreqTable,_FillFreqTable_FP
  5458.  
  5459. _FillFreqTable
  5460.     IFNE    OCTAMED_INTERN
  5461.         movea.l    _UtilityBase,a1
  5462.     ELSEIF
  5463.         movea.l    UtBase,a1
  5464.     ENDC
  5465.         movem.l    d2-d4,-(sp)
  5466.         move.l    d1,d2
  5467.         move.l    d0,d3
  5468.         moveq    #6*12-1,d4
  5469. 1$        move.l    d3,d0
  5470.         clr.w    d0
  5471.         swap    d0
  5472.         move.w    d0,(a0)+    ;store frequency
  5473.         move.l    d2,d1
  5474. ; multiply frequency (upper word) with ratio
  5475.         jsr    -$90(a1)    ;UMult32
  5476.         moveq    #0,d1
  5477.         move.w    d3,d1
  5478.         move.l    d0,d3        ;store previous result
  5479.         move.l    d2,d0
  5480. ; multiply lower word with ratio
  5481.         jsr    -$90(a1)    ;UMult32
  5482.         swap    d0
  5483.         add.w    d3,d0        ;add the middle word..
  5484.         swap    d3
  5485.         moveq    #0,d1
  5486.         addx.w    d1,d3        ;and possible carry
  5487.         swap    d3
  5488.         move.w    d0,d3        ;a new frequency.        
  5489.         dbra    d4,1$
  5490.         movem.l    (sp)+,d2-d4
  5491.         rts
  5492.  
  5493. ; -------------------------------------------------------------------
  5494. ; A floating point version... wow!!
  5495. ; (gives a bit more exact results... and of course now there's
  5496. ; finally some FP code in OctaMED!! (requires an FPU))
  5497. ; -------------------------------------------------------------------
  5498.  
  5499. _FillFreqTable_FP
  5500. ; D0 = base (C-1) frequency * 65536
  5501.  
  5502. ; used floating point regs:
  5503. ; FP0 = ratio of successive notes
  5504. ; FP1 = current frequency
  5505.         fmove.l    d0,fp1
  5506.         fdiv.x    #65536,fp1        ;frequency of C-1
  5507.         fmove.l    #1,fp0
  5508.         fdiv.x    #12,fp0
  5509.         ftwotox    fp0
  5510.         moveq    #6*12-1,d1
  5511. 1$        fmove.l    fp1,d0
  5512.         move.w    d0,(a0)+
  5513.         fmul.x    fp0,fp1
  5514.         dbra    d1,1$
  5515.         rts
  5516.         END
  5517.